class Csv::Admissions::Applicants::AdditionalFieldsService < Csv::Admissions::Applicants::Service
  private
    def fields
      @fields ||= @school.student_additional_fields
        .includes(:choices)
        .joins(admission_additional_fields: :application)
        .where(admission_applications: { id: applicants.map(&:application_id) })
        .where(admission_additional_fields: { display: true })
        .index_by(&:id)
    end

    def associations
      [:tags, :family, { student: :student_additional_values }]
    end

    def headers
      data = [
        'Student Code',
        'Student ID',
        'Student First Name',
        'Student Last Name',
        'Student Application Grade Code',
        'Student Application Grade Label',
        'Family Code',
        'Family Name'
      ]
      data += fields.values.map(&:name)
      data + ['Applicant Tags', 'Family Tags']
    end

    def content(applicant)
      student = applicant.student
      data = [
        student.code,
        student.id,
        student.first_name,
        student.last_name,
        applicant.grade,
        applicant.decorate.grade_level,
        applicant.family.code,
        applicant.family.name
      ]

      values = student.student_additional_values.index_by(&:student_additional_field_id)
      data += fields.map do |id, field|
        next unless (value = values[id])

        if field.date?
          value.value_date
        elsif field.multi_choice?
          field.choices.find { |c| c.value == value.value }&.name
        else
          value.value
        end
      end

      data + [
        applicant.tags.map(&:name).join(', '),
        family_tags[applicant.family_id]&.tags&.map(&:name)&.join(', ')
      ]
    end
end
