class Course < ApplicationRecord
  belongs_to :school
  belongs_to :department, optional: true

  has_many :grades, class_name: '::Course::Grade', inverse_of: :course, dependent: :destroy

  has_and_belongs_to_many :classrooms, join_table: :course_classrooms

  associations_for namespace: 'EdFi' do |a|
    a.has_many :ids, as: :associated, inverse_of: :associated, dependent: :destroy
    a.has_many :logs, as: :associated, inverse_of: :associated
  end

  accepts_nested_attributes_for :grades, allow_destroy: true

  before_create { self.core = true }

  before_save :null_empty_strings, if: -> { state_descriptor.blank? }

  before_destroy :remove_from_ed_fi, prepend: true

  validates :name, presence: true
  validates :credits, numericality: { greater_than_or_equal_to: 0 }, allow_nil: true

  scope :by_ids, ->(ids) { where(id: ids) if ids }
  scope :ordered, -> { order(:name) }

  def ed_fi_id_descriptor(key)
    if school.school_config.semesters?
      { 1 => 'Fall Semester', 2 => 'Spring Semester' }[key]
    else
      { 1 => 'First Trimester', 2 => 'Second Trimester', 3 => 'Third Trimester' }[key]
    end
  end

  private
    def null_empty_strings
      self.state_descriptor = nil
    end

    def remove_from_ed_fi
      return if ed_fi_ids.empty?

      EdFi::Indiana::Sandbox::CourseOfferingService.new(
        school.current_year.id,
        ids: ed_fi_ids.pluck(:number),
        course: self
      ).delete
    end
end
