class Admission::ApplicationGrade < ApplicationRecord
  belongs_to :application

  validate :prevent_duplicate_grade

  scope :by_available, -> { where(available: true) }

  def self.build_all(application)
    grades = application.school.grades_hash.keys - all.pluck(:grade)
    grades.each do |grade|
      application.application_grades.build(grade: grade)
    end
    application.application_grades.sort_by { |g| [g.grade] }
  end

  private
    def prevent_duplicate_grade
      enrollment = application.enrollment
      params = { enrollment: enrollment }
      if enrollment
        returning_students = application.returning_students
        new_students = application.new_students
        if returning_students && !new_students
          params[:returning_students] = 1
        elsif new_students && !returning_students
          params[:new_students] = 1
        end
      end
      application.siblings.where(params).includes(:application_grades).find_each do |application|
        application.application_grades.where(grade: grade).find_each do |grade|
          errors.add('Grade', "Invalid: #{self.grade}th") if available && grade.available
          break
        end
      end
    end
end
