module ActiveMerchant #:nodoc:
  module Billing #:nodoc:
    module Integrations #:nodoc:
      module Chronopay
        class Helper < ActiveMerchant::Billing::Integrations::Helper
          # All currently supported checkout languages:
          #   es (Spanish)
          #   en (English)
          #   de (German)
          #   pt (Portuguese)
          #   lv (Latvian)
          #   cn1 (Chinese Version 1)
          #   cn2 (Chinese version 2)
          #   nl (Dutch)
          #   ru (Russian)
          COUNTRIES_FOR_LANG = {
            'ES'  => %w( AR BO CL CO CR CU DO EC SV GQ GT HN MX NI PA PY PE ES UY VE),
            'DE'  => %w( DE AT CH LI ),
            'PT'  => %w( AO BR CV GW MZ PT ST TL),
            'RU'  => %w( BY KG KZ RU ),
            'LV'  => 'LV',
            'CN1' => 'CN',
            'NL'  => 'NL'
          }
          
          LANG_FOR_COUNTRY = COUNTRIES_FOR_LANG.inject(Hash.new("EN")) do |memo, (lang, countries)|
            countries.each do |code|
              memo[code] = lang
            end
            memo
          end
          

          self.country_format = :alpha3
          
          def initialize(order, account, options = {})
            super
            add_field('cb_type', 'p')
          end

          # product_id
          mapping :account, 'product_id'
          # product_name
          mapping :invoice, 'product_name'
          # product_price
          mapping :amount,   'product_price'
          # product_price_currency
          mapping :currency, 'product_price_currency'

          # f_name
          # s_name
          # email
          mapping :customer, :first_name => 'f_name',
                             :last_name  => 's_name',
                             :phone      => 'phone',
                             :email      => 'email'

          # city
          # street
          # state
          # zip
          # country - The country must be a 3 digit country code
          # phone

          mapping :billing_address, :city     => 'city',
                                    :address1 => 'street',
                                    :state    => 'state',
                                    :zip      => 'zip',
                                    :country  => 'country'

          def billing_address(mapping = {})
            # Gets the country code in the appropriate format or returns what we were given
            # The appropriate format for Chronopay is the alpha 3 country code
            country_code = lookup_country_code(mapping.delete(:country))
            add_field(mappings[:billing_address][:country], country_code)
            
            countries_with_supported_states = ['USA', 'CAN']
            if !countries_with_supported_states.include?(country_code)
              mapping.delete(:state)
              add_field(mappings[:billing_address][:state], 'XX')
            end  
            mapping.each do |k, v|
              field = mappings[:billing_address][k]
              add_field(field, v) unless field.nil?
            end 
            add_field('language', checkout_language_from_country(country_code))
          end        

          # card_no
          # exp_month
          # exp_year
          mapping :credit_card, :number       => 'card_no',
                                :expiry_month => 'exp_month',
                                :expiry_year  => 'exp_year'

          # cb_url
          mapping :notify_url, 'cb_url'

          # cs1
          mapping :order, 'cs1'

          # cs2
          # cs3
          # decline_url
          
          
          private
          
          def checkout_language_from_country(country_code)
            country    = Country.find(country_code)
            short_code = country.code(:alpha2).to_s
            LANG_FOR_COUNTRY[short_code]
          rescue InvalidCountryCodeError
            'EN'
          end
        end
      end
    end
  end
end