class Csv::Admissions::Applicants::CheckListService < Csv::Admissions::Applicants::Service
  private
    def checklists
      @checklists ||= @school.admission_checkboxes
        .joins(:applications)
        .where(admission_applications: { id: applicants.map(&:application_id) })
        .pluck(:id, :name)
        .to_h
    end

    def associations
      [:tags, :family, :applicant_checkboxes, { application: :checkboxes }]
    end

    def headers
      defaults = [
        'Student Code',
        'Student First Name',
        'Student Last Name',
        'Student Application Grade Code',
        'Student Application Grade Label',
        'Family Code',
        'Family Name'
      ]
      defaults += checklists.values
      defaults + ['Applicant Tags', 'Family Tags']
    end

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

      responses = applicant.application.checkboxes.map { |c| [c.id, 'No'] }.to_h

      applicant_checkboxes = applicant.applicant_checkboxes
      applicant_checkboxes.each { |a| responses[a.checkbox_id] = 'Yes' if a.checked? }

      data += checklists.keys.map { |a| responses[a] }
      data + [
        applicant.tags.map(&:name).join(', '),
        family_tags[applicant.family_id]&.tags&.map(&:name)&.join(', ')
      ]
    end
end
