# frozen_string_literal: true

module CheckoutHelper
  def shipping_and_billing_match?(order)
    order.ship_address == order.bill_address
  end

  def checkout_adjustments_for(order, opts = {})
    exclude = opts[:exclude] || {}
    reject_zero_amount = opts.fetch(:reject_zero_amount, true)

    adjustments = order.all_adjustments.eligible.to_a

    # Remove tax adjustments and (optionally) shipping fees
    adjustments.reject! { |a| a.originator_type == 'Spree::TaxRate' }
    if exclude.include? :shipping
      adjustments.reject! { |a|
        a.originator_type == 'Spree::ShippingMethod'
      }
    end
    if exclude.include? :payment
      adjustments.reject! { |a|
        a.originator_type == 'Spree::PaymentMethod'
      }
    end
    if exclude.include? :line_item
      adjustments.reject! { |a|
        a.adjustable_type == 'Spree::LineItem'
      }
    end

    if reject_zero_amount
      adjustments.reject! { |a| a.amount == 0 }
    end

    adjustments
  end

  def checkout_line_item_fees(order)
    order.line_item_adjustments.enterprise_fee
  end

  def checkout_subtotal(order)
    order.item_total + checkout_line_item_fees(order).sum(:amount)
  end

  def display_checkout_subtotal(order)
    Spree::Money.new checkout_subtotal(order), currency: order.currency
  end

  def display_checkout_tax_total(order)
    total_tax = order.total_tax + VoucherAdjustmentsService.new(order).voucher_included_tax

    Spree::Money.new(total_tax, currency: order.currency)
  end

  def display_checkout_taxes_hash(order)
    totals = Orders::FetchTaxAdjustmentsService.new(order).totals

    totals.map do |tax_rate, tax_amount|
      {
        amount: Spree::Money.new(tax_amount, currency: order.currency),
        percentage: number_to_percentage(tax_rate.amount * 100, precision: 1),
        rate_amount: tax_rate.amount,
      }
    end.sort_by { |tax| tax[:rate_amount] }
  end

  def display_line_item_tax_rates(line_item)
    line_item.tax_rates.map { |tr| number_to_percentage(tr.amount * 100, precision: 1) }.join(", ")
  end

  def display_adjustment_tax_rates(adjustment)
    tax_rates = TaxRateFinder.tax_rates_of(adjustment)
    tax_rates.map { |tr| number_to_percentage(tr.amount * 100, precision: 1) }.join(", ")
  end

  def display_adjustment_amount(adjustment)
    Spree::Money.new(adjustment.amount, currency: adjustment.currency)
  end

  def display_checkout_total_less_tax(order)
    Spree::Money.new order.total - order.total_tax, currency: order.currency
  end

  def validated_input(name, path, args = {})
    attributes = {
      :required => true,
      :type => :text,
      :name => path,
      :id => path,
      "ng-model" => path,
      "ng-class" => "{error: !fieldValid('#{path}')}"
    }.merge args

    render "shared/validated_input", name:, path:, attributes:
  end

  def validated_select(name, path, options, args = {})
    attributes = {
      :required => true,
      :id => path,
      "ng-model" => path,
      "ng-class" => "{error: !fieldValid('#{path}')}"
    }.merge args

    render "shared/validated_select", name:, path:, options:,
                                      attributes:
  end

  def payment_method_price(method, order)
    price = method.compute_amount(order)
    if price == 0
      t('checkout_method_free')
    else
      "{{ #{price} | localizeCurrency }}"
    end
  end

  def payment_or_shipping_price(method, order)
    return unless method

    price = method.compute_amount(order)
    if price.zero?
      t('checkout_method_free')
    else
      Spree::Money.new(price, currency: order.currency)
    end
  end

  def checkout_step
    params[:step]
  end

  def checkout_step?(step)
    checkout_step == step.to_s
  end

  def stripe_card_options(cards)
    cards.map do |cc|
      [
        "#{cc.brand} #{cc.last_digits} #{I18n.t(:card_expiry_abbreviation)}:" \
        "#{cc.month.to_s.rjust(2, '0')}/#{cc.year}", cc.id
      ]
    end
  end

  # Set the Page title of checkout process as step based like
  # Checkout Details, Checkout Payment and Checkout Summary
  def checkout_page_title
    t("checkout_#{checkout_step}_title")
  end
end
