class Admission::FamilyRevision < ApplicationRecord
  include Admissions::ApplicantApplicationBroadcastable
  include Validatable

  belongs_to :school_year
  belongs_to :family, class_name: '::Family'
  belongs_to :country, class_name: 'IsoCountry', optional: true
  belongs_to :country_2, class_name: 'IsoCountry', optional: true

  delegate :school, to: :school_year
  delegate :ed_fi_system_indiana?, to: :school
  delegate :admission_family_revision_fields, to: :school

  FAMILY_GROUPED_ATTRIBUTES = {
    mailing_address: [
      :address,
      :address_ext,
      :city,
      :county,
      :state,
      :zip,
      :country_id
    ],
    billing_address: [
      :address_2,
      :address_ext_2,
      :city_2,
      :state_2,
      :zip_2,
      :country_2_id
    ],
    family_directory: [
      :directory,
      :directory_address,
      :directory_phone,
      :directory_email,
      :directory_cell
    ]
  }

  FAMILY_ATTRIBUTES = FAMILY_GROUPED_ATTRIBUTES.values.flatten

  FAMILY_DIRECTORY_FIELDS = FAMILY_ATTRIBUTES[10..]

  after_initialize :set_defaults, if: :new_record?

  validates :address, :address_ext, :address_2, :address_ext_2, length: { maximum: 64 }
  validates :city, :state, :city_2, :state_2, length: { maximum: 32 }
  validates :zip, :zip_2, length: { maximum: 10 }
  validates :zip, length: { minimum: 5 }, if: -> { country_id == 236 && zip? }
  validates :zip_2, length: { minimum: 5 }, if: -> { country_2_id == 236 && zip_2? }

  def apply!(skip_api=false)
    return false if applied

    FAMILY_ATTRIBUTES.each { |a| family[a] = public_send(a) }
    return if skip_api

    Php::FamilySave.call(family)
    update(applied: true)
  end

  def incomplete_fields
    fields = admission_family_revision_fields.by_required_fields.pluck(:field)
    fields.map do |field|
      props = validate_fields[field].select { |p| send(p).blank? }
      props.map { |p| "#{field.chomp('_address')}_#{p.chomp('_2')}" }
    end.flatten
  end

  private
    def set_defaults
      FAMILY_ATTRIBUTES.each { |a| self[a] = family[a] }
    end

    def validate_fields
      {}.tap do |props|
        props['mailing_address'] = ['address', 'city']
        props['mailing_address'] += ['state', 'zip'] if country_id == 236
        props['mailing_address'] << 'county' if ed_fi_system_indiana?

        props['billing_address'] = ['address_2', 'city_2']
        props['billing_address'] += ['state_2', 'zip_2'] if country_2_id == 236
      end
    end
end
