class Admission::AdditionalValue < ApplicationRecord
  include Admissions::ApplicantApplicationBroadcastable

  audited associated_with: :applicant

  belongs_to :applicant
  belongs_to :student_additional_field

  after_initialize :set_defaults, if: :new_record?

  after_save :cleanup_null_values

  scope :join_application_fields, ->(application) do
    joins(student_additional_field: :admission_additional_fields)
      .where(admission_additional_fields: { application_id: application, display: true })
  end

  validates :value, length: { maximum: 255 }

  private
    def set_defaults
      if applicant.student_id
        student_value = applicant.student.student_additional_values
          .find_by(student_additional_field_id: student_additional_field_id)
        return if student_value.nil?

        type = student_additional_field.type.to_sym
        self.value =
          if type == :date && !student_value.value_date.nil?
            student_value.value_date.strftime('%m/%d/%Y')
          else
            student_value.value
          end
      end
    end

    def cleanup_null_values
      destroy if value.nil?
    end
end
