require 'net/http'

module ActiveMerchant #:nodoc:
  module Billing #:nodoc:
    module Integrations #:nodoc:
      module Gestpay
        class Notification < ActiveMerchant::Billing::Integrations::Notification
          include Common
          
          def complete?
            status == 'Completed'
          end 

          # The important param
          def item_id
            params['PAY1_SHOPTRANSACTIONID']
          end

          def transaction_id
            params['PAY1_BANKTRANSACTIONID']
          end

          # the money amount we received in X.2 decimal.
          def gross
            params['PAY1_AMOUNT']
          end
          
          def currency
            # Ruby 1.9 compat
            method = CURRENCY_MAPPING.respond_to?(:key) ? :key : :index
            CURRENCY_MAPPING.send(method, params['PAY1_UICCODE'])
          end

          def test?
            false
          end

          def status
            case params['PAY1_TRANSACTIONRESULT']
            when 'OK'
              'Completed'
            else
              'Failed'
            end
          end

          def acknowledge
            true
          end
          
          private
          # Take the posted data and move the relevant data into a hash
          def parse(query_string)
            @raw = query_string
            
            return if query_string.blank?
            encrypted_params = parse_delimited_string(query_string)
            
            return if encrypted_params['a'].blank? || encrypted_params['b'].blank?
            @params = decrypt_data(encrypted_params['a'], encrypted_params['b'])
          end
          
          def parse_delimited_string(string, delimiter = '&', unencode_cgi = false)
            result = {}
            for line in string.split(delimiter)
              key, value = *line.scan( %r{^(\w+)\=(.*)$} ).flatten
              result[key] = unencode_cgi ? CGI.unescape(value) : value
            end
            result
          end
          
          def decrypt_data(shop_login, encrypted_string)
            response = ssl_get(Gestpay.service_url, decryption_query_string(shop_login, encrypted_string))
            encoded_response = parse_response(response)
            parse_delimited_string(encoded_response, DELIMITER, true)
          end
        
          def decryption_query_string(shop_login, encrypted_string)
            "#{DECRYPTION_PATH}?a=" + CGI.escape(shop_login) + "&b=" + encrypted_string + "&c=" + CGI.escape(VERSION)
          end
        end
      end
    end
  end
end
