# frozen_string_literal: true

class EnterpriseFee < ApplicationRecord
  include CalculatedAdjustments

  acts_as_paranoid

  belongs_to :enterprise
  belongs_to :tax_category, optional: true, class_name: 'Spree::TaxCategory'

  has_many :coordinator_fees, dependent: :destroy
  has_many :order_cycles, through: :coordinator_fees

  has_many :exchange_fees, dependent: :destroy
  has_many :exchanges, through: :exchange_fees

  FEE_TYPES = %w(packing transport admin sales fundraising).freeze
  PER_ORDER_CALCULATORS = ['Calculator::FlatRate',
                           'Calculator::FlexiRate',
                           'Calculator::PriceSack'].freeze

  validates :fee_type, inclusion: { in: FEE_TYPES }
  validates :name, presence: true

  before_save :ensure_valid_tax_category_settings

  scope :for_enterprise, lambda { |enterprise| where(enterprise_id: enterprise) }
  scope :for_enterprises, lambda { |enterprises| where(enterprise_id: enterprises) }

  scope :managed_by, lambda { |user|
    if user.admin?
      where(nil)
    else
      where(enterprise_id: user.enterprises.select(&:id))
    end
  }

  scope :per_item, lambda {
    joins(:calculator).where.not(spree_calculators: { type: PER_ORDER_CALCULATORS })
  }
  scope :per_order, lambda {
    joins(:calculator).where(spree_calculators: { type: PER_ORDER_CALCULATORS })
  }

  def self.clear_order_adjustments(order)
    order.all_adjustments.enterprise_fee.where.not(adjustable_type: "Spree::LineItem").destroy_all
  end

  private

  def ensure_valid_tax_category_settings
    # Setting an explicit tax_category removes any inheritance behaviour
    # In the absence of any current changes to tax_category, setting
    # inherits_tax_category to true will clear the tax_category
    if tax_category_id_changed?
      self.inherits_tax_category = false if tax_category.present?
    elsif inherits_tax_category_changed?
      self.tax_category_id = nil if inherits_tax_category?
    end

    if inherits_tax_category? && PER_ORDER_CALCULATORS.include?(calculator_type)
      errors.add(:base, :inherit_tax_requires_per_item_calculator)
      throw :abort
    end

    true
  end
end
