class Admission::Applicants::FamilyContactService < ApplicationService
  def initialize(applicant, application, family=nil, school_year=nil)
    @applicant = applicant
    @application = application
    @family = family
    @school_year = school_year
  end

  def props
    (revision_props + contact_family_props).sort_by { |c| c[:full_name_reverse] }
  end

  def non_primary_emergency_contact?
    return true unless emergency_contact_required?
    return true if revisions.with_non_primary_emergency_contact(school_year)

    family.contact_families
      .where.not(id: revisions.map(&:contact_family_id))
      .find_by(emergency: true, primary: false)
      .present?
  end

  private
    def school
      @school ||= @application.school
    end

    def family
      @family ||= @applicant.family
    end

    def school_year
      @school_year ||= @application.school_year
    end

    def revisions
      @revisions ||= family.admission_contact_revisions
        .by_school_year(school_year)
    end

    def contact_families
      @contact_families ||= family.contact_families
        .includes(:contact)
        .where.not(id: revisions.map(&:contact_family_id).compact)
    end

    def emergency_contact_required?
      school.admission_contact_revision_fields.with_display.find_by(field: :emergency_contact)
    end

    def revision_props
      revisions.map do |revision|
        {
          id: revision.id,
          contact_family_id: revision.contact_family_id,
          full_name_reverse: revision.full_name(:reverse),
          primary: revision.primary?,
          emergency: revision.emergency?,
          pickup: revision.pickup?
        }
      end
    end

    def contact_family_props
      contact_families.map do |contact_family|
        {
          id: nil,
          contact_family_id: contact_family.id,
          full_name_reverse: contact_family.contact.full_name(:reverse),
          primary: contact_family.primary,
          emergency: contact_family.emergency,
          pickup: contact_family.pickup
        }
      end
    end
end
