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

  belongs_to :family, class_name: '::Family'
  belongs_to :family_additional_field, class_name: '::FamilyAdditionalField'
  belongs_to :school_year

  alias_attribute :field_id, :family_additional_field_id

  after_initialize :set_defaults, if: :new_record?
  after_initialize :set_school_year, unless: :school_year_id

  scope :by_school_year, ->(school_year) { where(school_year_id: school_year) if school_year }

  scope :join_displayable_additional_fields, -> do
    joins(family_additional_field: :admission_family_additional_fields)
      .where(admission_family_additional_fields: { display: true })
  end

  def self.build_all(family)
    field_ids = all.pluck(:family_additional_field_id)
    fields = family.family_additional_values
      .without_field_id(field_ids)
      .pluck(:family_additional_field_id)

    fields.each do |field_id|
      family.admission_family_additional_values.build(family_additional_field_id: field_id)
    end

    family.admission_family_additional_values
  end

  def self.apply!
    additional_values = all.to_a
    return if additional_values.blank?

    options = additional_values.map do |additional_value|
      {
        family_additional_field_id: additional_value.family_additional_field_id,
        value: additional_value.value
      }
    end

    Php::FamilySave.call(additional_values.first.family, additional_fields: options)
  end

  def apply!
    additional_values = family.family_additional_values
    additional_value = additional_values.find { |v| v.field_id == field_id }
    additional_value = additional_values.build(field_id: field_id) if additional_value.nil?
    additional_value.value = value
  end

  private
    def set_defaults
      family_value = family.family_additional_values
        .find_by(family_additional_field: family_additional_field)
      return if family_value.nil?

      self.value = family_value.value
    end

    def set_school_year
      self.school_year = family.school.admission_school_year
    end
end
