class FinancialAidApplication < ApplicationRecord
  audited

  attr_accessor :contact_ids, :calculate

  enum status: { pending: 0, submitted: 1 }
  enum credit_report_status: { waitlisted: 1, ineligible: 2, pending: 3, awarded: 4, denied: 5 },
    _prefix: true

  belongs_to :family, foreign_key: :family_id, inverse_of: :financial_aid_applications
  belongs_to :school_year, foreign_key: :school_year_id, inverse_of: :financial_aid_applications

  has_many :answers, foreign_key: :application_id, class_name: :FinancialAidAnswer,
    dependent: :destroy
  has_many :application_contacts, foreign_key: :application_id, class_name: :FinancialAidContact,
    dependent: :destroy
  has_many :connection_logs, class_name: '::ConnectionLog', as: :associated, dependent: :destroy

  has_many_attached :income_files
  has_many_attached :fixed_expense_files
  has_many_attached :variable_expense_files
  has_many_attached :debt_files
  has_many_attached :asset_files
  has_many_attached :retirement_fund_files
  
  delegate :school, to: :school_year

  after_initialize -> { self.school_year = family.school.admission_config.school_year },
    if: :new_record?

  before_validation :validate_contacts, if: :contact_ids

  before_save :update_contacts, if: :contact_ids
  before_save :calculate_score, if: :calculate
  before_save :set_submitted_at, if: :status_changed?
  before_save :set_scored_at, if: :score_changed?

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

  def calculate_score
    self.calculate = false
    FinancialAid::CalculateScoreService.call(self)
  end

  private
    def set_submitted_at
      self.submitted_at = Time.now if submitted?
    end

    def set_scored_at
      self.scored_at = Time.now if score?
    end

    def validate_contacts
      return if contact_ids.present?

      errors.add(:contacts, "cannot be blank")
    end

    def update_contacts
      application_contact_ids = application_contacts.pluck(:contact_id)
      application_contacts.where(id: application_contact_ids - contact_ids).destroy_all
      (contact_ids - application_contact_ids).each do |id|
        application_contacts.create!(contact_id: id)
      end
    end
end
