class Csv::Admissions::Families::PaymentService < Csv::ApplicationService
  def initialize(school, options)
    @school = school
    @school_year_id = options['school_year_id']
    @payment_status = options['payment_status']
    @tag_ids = options['tag_ids']
  end

  def call
    CSV.generate do |csv|
      csv << headers
      families.each do |family|
        csv << content(family)
      end
    end
  end

  private
    def school_year
      @school_year ||= @school.school_years.find(@school_year_id)
    end

    def families
      @families ||= @school.families
        .left_join_admission_payment(@payment_status, @school_year_id)
        .by_application_school_year(@school_year_id)
        .with_tags(@tag_ids)
    end

    def admission_families
      @admission_families ||= school_year.admission_families
        .includes(:tags)
        .by_payment_status(@payment_status)
        .with_tags(@tag_ids)
        .index_by(&:family_id)
    end

    def headers
      [
        'Family Code',
        'Family ID',
        'Family Name',
        'Family Fee Description',
        'Family Fee Amount',
        'Paid Status',
        'Paid Date',
        'Family Tags'
      ]
    end

    def content(family)
      admission_family = admission_families[family.id]
      [
        family.code,
        family.id,
        family.name,
        admission_family&.payment_description,
        admission_family&.payment_amount,
        admission_family&.payment_status&.titleize || 'Not Paid',
        admission_family&.paid_at,
        admission_family&.tags&.map(&:name)&.join(', ')
      ]
    end
end
