# frozen_string_literal: true

require 'active_support/concern'

# Contains the methods to compute an order balance form the point of view of the enterprise and not
# the individual shopper.
module Balance
  FINALIZED_NON_SUCCESSFUL_STATES = %w(canceled returned).freeze

  # Branches by the OrderBalance abstraction
  def outstanding_balance
    @outstanding_balance ||= OrderBalance.new(self)
  end

  # Returns the order balance by considering the total as money owed to the order distributor aka.
  # the shop, and as a positive balance of said enterprise. If the customer pays it all, the
  # distributor and customer are even.
  #
  # Note however, this is meant to be used only in the context of a single order object. When
  # working with a collection of orders, such as an index controller action, please consider using
  # `app/queries/outstanding_balance.rb` instead so we avoid potential N+1s.
  def new_outstanding_balance
    if state.in?(FINALIZED_NON_SUCCESSFUL_STATES)
      -payment_total
    else
      total - payment_total
    end
  end

  def outstanding_balance?
    !outstanding_balance.zero?
  end

  def display_outstanding_balance
    outstanding_balance.display_amount
  end
end
