class Csv::HumanResources::DynamicReportService < Csv::ApplicationService
  def initialize(school, params)
    @school = school
    @status = params['status']
    @categories = params['categories']
    @sort_by = params['sort_by']
    @properties = params['properties']
  end

  def call
    CSV.generate do |csv|
      csv << property_headers
      employees.each do |employee|
        csv << @properties.map do |p|
          p = JSON.parse(p)
          if p['additional_field']
            value = employee.employee_additional_values.find_by(field_id: p['value'])
            case p['type']
            when 'text'
              value&.value
            when 'date'
              value&.value_date
            when 'multi_choice'
              if p['output'] == 'value'
                value&.value
              elsif p['output'] == 'label'
                value&.field&.choices&.find_by(value: value&.value)&.name
              end
            end
          else
            employee.send(p['value'])
          end
        end
      end
    end
  end

  private
    def property_headers
      @properties.map do |p|
        d = JSON.parse(p)
        d['label']
      end
    end

    def employees
      @school.employees
        .is_current(@status&.to_bool)
        .by_categories(@categories)
        .order(@sort_by)
        .decorate
    end
end
