module ActiveMerchant #:nodoc:
  module Billing #:nodoc:
    module Integrations #:nodoc:
      module WebPay
        class Helper < ActiveMerchant::Billing::Integrations::Helper
          include Common

          def initialize(order, account, options = {})
            @md5secret = options.delete(:secret)
            @line_item_count = 0
            super
          end

          def form_fields
            @fields.merge(ActiveMerchant::Billing::Integrations::WebPay.signature_parameter_name => generate_signature(:request))
          end

          def params
            @fields
          end

          def secret
            @md5secret
          end

          def add_line_item(options)
            options.each do |key, value|
              add_field("wsb_invoice_item_#{key}[#{@line_item_count}]", value)
            end

            @line_item_count += 1
          end

          def calculate_total
            sum = 0

            @line_item_count.times do |i|
              sum += @fields["wsb_invoice_item_quantity[#{i}]"].to_i * @fields["wsb_invoice_item_price[#{i}]"].to_i
            end

            sum + @fields[mappings[:tax]].to_i + @fields[mappings[:shipping_price]].to_i - @fields[mappings[:discount_price]].to_i
          end

          mapping :scart, '*scart'
          mapping :account, 'wsb_storeid'
          mapping :store, 'wsb_store'
          mapping :order, 'wsb_order_num'
          mapping :currency, 'wsb_currency_id'
          mapping :version, 'wsb_version'
          mapping :language, 'wsb_language_id'
          mapping :seed, 'wsb_seed'
          mapping :success_url, 'wsb_return_url'
          mapping :cancel_url, 'wsb_cancel_return_url'
          mapping :notify_url, 'wsb_notify_url'
          mapping :test, 'wsb_test'
          mapping :tax, 'wsb_tax'
          mapping :shipping_name, 'wsb_shipping_name'
          mapping :shipping_price, 'wsb_shipping_price'
          mapping :discount_name, 'wsb_discount_name'
          mapping :discount_price, 'wsb_discount_price'
          mapping :amount, 'wsb_total'
          mapping :email, 'wsb_email'
          mapping :phone, 'wsb_phone'
        end
      end
    end
  end
end