class Billing::PlanTransaction < ApplicationRecord
  belongs_to :plan
  belongs_to :detail, class_name: 'Billing::TransactionDetail', foreign_key: :detail_id

  has_many :processed_transactions, class_name: 'Billing::ProcessedTransaction', dependent: :destroy

  delegate :student, to: :plan

  validates :detail_id, uniqueness: { scope: :plan_id }

  validate :template_school_year_match

  after_destroy :destroy_assocations

  scope :by_plan, ->(plan) { where(plan_id: plan) if plan }

  private
    def destroy_assocations
      return if detail.template_transaction.present?

      detail.destroy!
    end

    def template_school_year_match
      return unless (template_transaction = detail.template_transaction)
      return if template_transaction.template.school_year_id == plan.school_year_id

      plan.errors.add(:base, 'Cannot attach template from a different school year')
    end
end
