class Csv::Admissions::Applicants::FamilyService < Csv::Admissions::Applicants::Service
  def call
    CSV.generate do |csv|
      csv << headers
      applicants.map do |applicant|
        content(csv, applicant)
      end
    end
  end

  private
    def associations
      [
        :tags,
        :application,
        :status,
        { family: { contact_families: [:relationship, { contact: :title }] } }
      ]
    end

    def headers
      [
        'Student Code',
        'Student ID',
        'Student First Name',
        'Student Last Name',
        'DOB',
        'Gender',
        'Application Grade Code',
        'Application Grade Label',
        'Application Name',
        'Status',
        'Created Date',
        'Submitted Date',
        'Applicant Tags',
        'Family Tags',
        'Family Code',
        'Family Name',
        'Contact Relationship',
        'Contact Title',
        'Contact First Name',
        'Contact Last Name',
        'Contact Address',
        'Contact Address 2',
        'Contact City',
        'Contact State',
        'Contact Zip',
        'Contact Home Phone',
        'Contact Cell Phone',
        'Contact Email'
      ]
    end

    def content(csv, applicant)
      applicant.family.contact_families.each do |contact_family|
        next unless contact_family.primary?

        contact = contact_family.contact
        csv << [
          applicant.student&.code,
          applicant.student&.id,
          applicant.reviewed_prop(:first_name),
          applicant.reviewed_prop(:last_name),
          applicant.reviewed_prop(:date_of_birth),
          applicant.reviewed_prop(:gender_label),
          applicant.grade,
          grade_levels[applicant.grade],
          applicant.application.name,
          applicant.system_status,
          applicant.created_date,
          applicant.submission_date,
          applicant.tags.map(&:name).join(', '),
          family_tags[applicant.family_id]&.tags&.map(&:name)&.join(', '),
          applicant.family.code,
          applicant.family.name,
          contact_family.relationship&.name,
          contact.title&.name,
          contact.first_name,
          contact.last_name,
          contact.address,
          contact.address_ext,
          contact.city,
          contact.state,
          contact.zip,
          contact.home_phone,
          contact.cell_phone,
          contact.email
        ]
      end
    end
end
