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

  belongs_to :school_year
  belongs_to :family, class_name: '::Family'
  belongs_to :physician_country, class_name: 'IsoCountry', optional: true
  belongs_to :dentist_country, class_name: 'IsoCountry', optional: true

  delegate :school, to: :school_year
  delegate :admission_medical_revision_fields, to: :school

  MEDICAL_GROUPED_ATTRIBUTES = {
    family_physician: [
      :physician,
      :physician_phone,
      :physician_address,
      :physician_address_ext,
      :physician_city,
      :physician_state,
      :physician_zip,
      :physician_country_id
    ],
    family_dentist: [
      :dentist,
      :dentist_phone,
      :dentist_address,
      :dentist_address_ext,
      :dentist_city,
      :dentist_state,
      :dentist_zip,
      :dentist_country_id
    ],
    family_insurance: [
      :insurance_company,
      :insurance_plan,
      :insurance_group
    ],
    preferred_hospital: [
      :hospital,
      :comments
    ]
  }

  MEDICAL_ATTRIBUTES = MEDICAL_GROUPED_ATTRIBUTES.values.flatten

  after_initialize do
    family_medical = family.find_or_build_family_medical
    if new_record? && !family_medical.new_record?
      MEDICAL_ATTRIBUTES.each { |a| public_send("#{a}=", family_medical[a]) }
    end
  end

  def incomplete_fields
    fields = admission_medical_revision_fields.by_required.pluck(:field)
    fields.select { |f| incomplete?(f) }
  end

  def incomplete?(field)
    case field
    when 'family_physician'
      physician.blank?
    when 'family_dentist'
      dentist.blank?
    when 'family_insurance'
      insurance_company.blank?
    when 'preferred_hospital'
      hospital.blank?
    else
      false
    end
  end

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

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

    options = family_medical.format_attributes_with_values
    Php::FamilySave.call(family, medical: options)

    update(applied: true)
  end
end
