<?php
/**
* Modulo Skrill
*
* @author    Kijam.com <info@kijam.com>
* @copyright 2014 Kijam.com
* @license   Comercial
*/

if (!defined('_PS_VERSION_'))
	exit;

class PaymentSkrill extends PaymentModule
{
	private static $currency_accepted = array('EUR', 'TWD', 'USD', 'GBP', 'THB', 'CZK', 'HUF', 'SKK', 'EEK', 'CAD', 'BGN', 'AUD', 'PLN', 'CHF', 'ISK', 'DKK',
												'INR', 'SEK', 'KRW', 'NOK', 'ZAR', 'ILS', 'RON', 'MYR', 'HRK', 'NZD', 'LTL', 'TRY', 'JOD', 'AED', 'OMR',
												'MAD', 'RSD', 'QAR', 'TND', 'SAR');

	/* MoneyBookers countries (for iso 3 letters compatibility) */
	private static $ps_to_skrill_country = array('AF' => 'AFG', 'AL' => 'ALB', 'DZ' => 'DZA', 'AS' => 'ASM', 'AD' => 'AND', 'AO' => 'AGO', 'AI' => 'AIA', 'AQ' => 'ATA', 'AG' => 'ATG', 'AR' => 'ARG',
		'AM' => 'ARM', 'AW' => 'ABW', 'AU' => 'AUS', 'AT' => 'AUT', 'AZ' => 'AZE', 'BS' => 'BHS', 'BH' => 'BHR', 'BD' => 'BGD', 'BB' => 'BRB', 'BY' => 'BLR', 'BE' => 'BEL',
		'BZ' => 'BLZ', 'BJ' => 'BEN', 'BM' => 'BMU', 'BT' => 'BTN', 'BO' => 'BOL', 'BA' => 'BIH', 'BW' => 'BWA', 'BV' => 'BVT', 'BR' => 'BRA', 'IO' => 'IOT', 'BN' => 'BRN',
		'BG' => 'BGR', 'BF' => 'BFA', 'BI' => 'BDI', 'KH' => 'KHM', 'CM' => 'CMR', 'CA' => 'CAN', 'CV' => 'CPV', 'KY' => 'CYM', 'CF' => 'CAF', 'TD' => 'TCD', 'CL' => 'CHL',
		'CN' => 'CHN', 'CX' => 'CXR', 'CC' => 'CCK', 'CO' => 'COL', 'KM' => 'COM', 'CG' => 'COG', 'CK' => 'COK', 'CR' => 'CRI', 'CI' => 'CIV', 'HR' => 'HRV', 'CU' => 'CUB',
		'CY' => 'CYP', 'CZ' => 'CZE', 'DK' => 'DNK', 'DJ' => 'DJI', 'DM' => 'DMA', 'DO' => 'DOM', 'TP' => 'TMP', 'EC' => 'ECU', 'EG' => 'EGY', 'SV' => 'SLV', 'GQ' => 'GNQ',
		'ER' => 'ERI', 'EE' => 'EST', 'ET' => 'ETH', 'FK' => 'FLK', 'FO' => 'FRO', 'FJ' => 'FJI', 'FI' => 'FIN', 'FR' => 'FRA', 'FX' => 'FXX', 'GF' => 'GUF', 'PF' => 'PYF',
		'TF' => 'ATF', 'GA' => 'GAB', 'GM' => 'GMB', 'GE' => 'GEO', 'DE' => 'DEU', 'GH' => 'GHA', 'GI' => 'GIB', 'GR' => 'GRC', 'GL' => 'GRL', 'GD' => 'GRD', 'GP' => 'GLP',
		'GU' => 'GUM', 'GT' => 'GTM', 'GN' => 'GIN', 'GW' => 'GNB', 'GY' => 'GUY', 'HT' => 'HTI', 'HM' => 'HMD', 'HN' => 'HND', 'HK' => 'HKG', 'HU' => 'HUN', 'IS' => 'ISL',
		'IN' => 'IND', 'ID' => 'IDN', 'IR' => 'IRN', 'IQ' => 'IRQ', 'IE' => 'IRL', 'IL' => 'ISR', 'IT' => 'ITA', 'JM' => 'JAM', 'JP' => 'JPN', 'JO' => 'JOR', 'KZ' => 'KAZ',
		'KE' => 'KEN', 'KI' => 'KIR', 'KP' => 'PRK', 'KR' => 'KOR', 'KW' => 'KWT', 'KG' => 'KGZ', 'LA' => 'LAO', 'LV' => 'LVA', 'LB' => 'LBN', 'LS' => 'LSO', 'LR' => 'LBR',
		'LY' => 'LBY', 'LI' => 'LIE', 'LT' => 'LTU', 'LU' => 'LUX', 'MO' => 'MAC', 'MK' => 'MKD', 'MG' => 'MDG', 'MW' => 'MWI', 'MY' => 'MYS', 'MV' => 'MDV', 'ML' => 'MLI',
		'MT' => 'MLT', 'MH' => 'MHL', 'MQ' => 'MTQ', 'MR' => 'MRT', 'MU' => 'MUS', 'YT' => 'MYT', 'MX' => 'MEX', 'FM' => 'FSM', 'MD' => 'MDA', 'MC' => 'MCO', 'MN' => 'MNG',
		'MS' => 'MSR', 'MA' => 'MAR', 'MZ' => 'MOZ', 'MM' => 'MMR', 'NA' => 'NAM', 'NR' => 'NRU', 'NP' => 'NPL', 'NL' => 'NLD', 'AN' => 'ANT', 'NC' => 'NCL', 'NZ' => 'NZL',
		'NI' => 'NIC', 'NE' => 'NER', 'NG' => 'NGA', 'NU' => 'NIU', 'NF' => 'NFK', 'MP' => 'MNP', 'NO' => 'NOR', 'OM' => 'OMN', 'PK' => 'PAK', 'PW' => 'PLW', 'PA' => 'PAN',
		'PG' => 'PNG', 'PY' => 'PRY', 'PE' => 'PER', 'PH' => 'PHL', 'PN' => 'PCN', 'PL' => 'POL', 'PT' => 'PRT', 'PR' => 'PRI', 'QA' => 'QAT', 'RE' => 'REU', 'RO' => 'ROM',
		'RU' => 'RUS', 'RW' => 'RWA', 'KN' => 'KNA', 'LC' => 'LCA', 'VC' => 'VCT', 'WS' => 'WSM', 'SM' => 'SMR', 'ST' => 'STP', 'SA' => 'SAU', 'SN' => 'SEN', 'SC' => 'SYC',
		'SL' => 'SLE', 'SG' => 'SGP', 'SK' => 'SVK', 'SI' => 'SVN', 'SB' => 'SLB', 'SO' => 'SOM', 'ZA' => 'ZAF', 'GS' => 'SGS', 'ES' => 'ESP', 'LK' => 'LKA', 'SH' => 'SHN',
		'PM' => 'SPM', 'SD' => 'SDN', 'SR' => 'SUR', 'SJ' => 'SJM', 'SZ' => 'SWZ', 'SE' => 'SWE', 'CH' => 'CHE', 'SY' => 'SYR', 'TW' => 'TWN', 'TJ' => 'TJK', 'TZ' => 'TZA',
		'TH' => 'THA', 'TG' => 'TGO', 'TK' => 'TKL', 'TO' => 'TON', 'TT' => 'TTO', 'TN' => 'TUN', 'TR' => 'TUR', 'TM' => 'TKM', 'TC' => 'TCA', 'TV' => 'TUV', 'UG' => 'UGA',
		'UA' => 'UKR', 'AE' => 'ARE', 'GB' => 'GBR', 'US' => 'USA', 'UM' => 'UMI', 'UY' => 'URY', 'UZ' => 'UZB', 'VU' => 'VUT', 'VA' => 'VAT', 'VE' => 'VEN', 'VN' => 'VNM',
		'VG' => 'VGB', 'VI' => 'VIR', 'WF' => 'WLF', 'EH' => 'ESH', 'YE' => 'YEM', 'YU' => 'YUG', 'ZR' => 'ZAR', 'ZM' => 'ZMB', 'ZW' => 'ZWE');

	public static $skrill_marchent_email;
	public static $skrill_marchent_mqi_secret;
	public static $skrill_verified;
	public static $skrill_fee;
	public static $skrill_fee_trans;
	private static $skrill_logo_id;
	private static $skrill_logo_url;
	private static $skrill_convert;
	private static $scrill_errors;
	private static $site_url;

	public function __construct()
	{
		$this->name = 'paymentskrill';
		$this->tab = 'payments_gateways';
		$this->version = '1.0.7';
		$this->author = 'Kijam.com';
		$this->module_key = 'dc633fd393b7b67baa68d995a9cedd29';

		parent::__construct();

		$this->displayName = $this->l('Skrill (Moneybookers) Instant Checkout with extra fee');
		$this->description = $this->l('The Skrill Global Payment Suite offers everything you need to accept global payments easily and cost effectively.');

		if (version_compare(_PS_VERSION_, '1.6.0.0') >= 0)
			$this->bootstrap = true;

		self::$site_url = Tools::htmlentitiesutf8((Configuration::get('PS_SSL_ENABLED') ? 'https://' : 'http://').$_SERVER['HTTP_HOST'].__PS_BASE_URI__);
		self::$skrill_marchent_email = Configuration::get('skrill_marchent_email');
		self::$skrill_marchent_mqi_secret = Configuration::get('skrill_marchent_mqi_secret');
		self::$skrill_fee = (float)Configuration::get('skrill_fee');
		self::$skrill_fee_trans = (float)Configuration::get('skrill_fee_trans');
		self::$skrill_verified = (bool)Configuration::get('skrill_verified');
		self::$skrill_logo_id = (int)Configuration::get('skrill_logo_id');
		self::$skrill_logo_url = (string)Configuration::get('skrill_logo_url');
		self::$skrill_convert = (array)Tools::jsonDecode(Configuration::get('skrill_convert'), true);
		self::$scrill_errors = array();


		if (empty(self::$skrill_marchent_email) || empty(self::$skrill_marchent_mqi_secret))
			$this->warning = $this->l('PaymentSkrill unconfigured');

		/** Backward compatibility */
		require(_PS_MODULE_DIR_.$this->name.'/backward_compatibility/backward.php');
	}

	public static function log($data)
	{
		if (!is_dir(_PS_MODULE_DIR_.'paymentskrill/logs'))
			@mkdir(_PS_MODULE_DIR_.'paymentskrill/logs');

		if (!is_dir(_PS_MODULE_DIR_.'paymentskrill/logs/'.date('Y-m')))
			@mkdir(_PS_MODULE_DIR_.'paymentskrill/logs/'.date('Y-m'));

		$fp = fopen(_PS_MODULE_DIR_.'paymentskrill/logs/'.date('Y-m').'/log-'.date('Y-m-d').'.log', 'a');

		fwrite($fp, "----------------------------------\n");
		fwrite($fp, 'DATE: '.date('Y-m-d H:i:s')."\n");
		fwrite($fp, "----------------------------------\n\n");
		fwrite($fp, $data);
		fwrite($fp, "\n\n----------------------------------\n\n");
		fwrite($fp, "----------------------------------\n\n");
		fclose($fp);
	}

	private function deleteOrdersState()
	{
		if ((int)Configuration::get('SKRILL_OS_AUTHORIZATION'))
		{
			$order_state = new OrderState((int)Configuration::get('SKRILL_OS_AUTHORIZATION'));
			@unlink(dirname(__FILE__).'/../../views/img/os/'.(int)$order_state->id.'.gif');
			$order_state->delete();
		}

		if ((int)Configuration::get('SKRILL_OS_PENDING'))
		{
			$order_state = new OrderState((int)Configuration::get('SKRILL_OS_PENDING'));
			@unlink(dirname(__FILE__).'/../../views/img/os/'.(int)$order_state->id.'.gif');
			$order_state->delete();
		}

		if ((int)Configuration::get('SKRILL_OS_REFUSED'))
		{
			$order_state = new OrderState((int)Configuration::get('SKRILL_OS_REFUSED'));
			@unlink(dirname(__FILE__).'/../../views/img/os/'.(int)$order_state->id.'.gif');
			$order_state->delete();
		}
	}

	private function createOrderState()
	{
		$this->deleteOrdersState();
		$order_state = new OrderState();
		$order_state->name = array();

		foreach (Language::getLanguages() as $language)
		{
			$order_state->name[$language['id_lang']] = $this->l('Payment Accepted by Skrill');
			$order_state->template[$language['id_lang']] = 'payment';
		}

		$order_state->send_email = true;
		$order_state->color = '#00FF00';
		$order_state->hidden = false;
		$order_state->delivery = false;
		$order_state->logable = true;
		$order_state->invoice = true;
		$order_state->template = 'payment';
		if ($order_state->add())
		{
			$source = dirname(__FILE__).'/views/img/state_ms_1.gif';
			$destination = dirname(__FILE__).'/../../views/img/os/'.(int)$order_state->id.'.gif';
			@copy($source, $destination);
		}
		Configuration::updateValue('SKRILL_OS_AUTHORIZATION', (int)$order_state->id);

		$order_state = new OrderState();
		$order_state->name = array();

		foreach (Language::getLanguages() as $language)
			$order_state->name[$language['id_lang']] = $this->l('Skrill Payment Pending');

		$order_state->send_email = false;
		$order_state->color = '#DDEEFF';
		$order_state->hidden = false;
		$order_state->delivery = false;
		$order_state->logable = false;
		$order_state->invoice = false;

		if ($order_state->add())
		{
			$source = dirname(__FILE__).'/views/img/state_ms_2.gif';
			$destination = dirname(__FILE__).'/../../views/img/os/'.(int)$order_state->id.'.gif';
			@copy($source, $destination);
		}
		Configuration::updateValue('SKRILL_OS_PENDING', (int)$order_state->id);

		$order_state = new OrderState();
		$order_state->name = array();

		foreach (Language::getLanguages() as $language)
		{
			$order_state->name[$language['id_lang']] = $this->l('Payment Declined by Skrill');
			$order_state->template[$language['id_lang']] = 'order_canceled';
		}

		$order_state->send_email = true;
		$order_state->color = '#FF0000';
		$order_state->hidden = false;
		$order_state->delivery = false;
		$order_state->logable = false;
		$order_state->invoice = false;
		if ($order_state->add())
		{
			$source = dirname(__FILE__).'/views/img/state_ms_3.gif';
			$destination = dirname(__FILE__).'/../../views/img/os/'.(int)$order_state->id.'.gif';
			@copy($source, $destination);
		}
		Configuration::updateValue('SKRILL_OS_REFUSED', (int)$order_state->id);

		return true;
	}

	public function install()
	{
		if (!function_exists('curl_version'))
		{
			$this->_errors[] = $this->l('Curl is not installed');
			return false;
		}

		$db_created = Db::getInstance()->Execute('CREATE TABLE IF NOT EXISTS `'._DB_PREFIX_.'skrill_status` (
				`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
				`id_order` INT(11) NOT NULL,
				`id_shop` INT(11) NOT NULL,
				`transaction_id` varchar(100) NOT NULL,
				`status` INT(11) NOT NULL,
				`next_retry` INT(11) NOT NULL,
				UNIQUE(transaction_id),
				INDEX(id_order),
				INDEX(id_shop),
				INDEX(next_retry, status)
				)');

		if (!$db_created)
			$this->_errors[] = $this->l('Could not create the table in the Database');

		$result = $db_created && parent::install()
			&& $this->registerHook('orderConfirmation')
			&& $this->registerHook('payment')
			&& (_PS_VERSION_ < '1.5'?$this->registerHook('PDFInvoice'):$this->registerHook('displayPDFInvoice'))
			&& (_PS_VERSION_ < '1.5'?$this->registerHook('header'):$this->registerHook('displayHeader'));

		if (!$result && $db_created)
			Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'skrill_status`');

		if ($result)
			$this->createOrderState();

		return $result;
	}

	public function uninstall()
	{
		$this->deleteOrdersState();

		Configuration::deleteByName('skrill_marchent_email');
		Configuration::deleteByName('skrill_marchent_secret');
		Configuration::deleteByName('skrill_marchent_mqi_secret');
		Configuration::deleteByName('skrill_fee');
		Configuration::deleteByName('skrill_fee_trans');
		Configuration::deleteByName('skrill_verified');

		Db::getInstance()->Execute('DROP TABLE IF EXISTS `'._DB_PREFIX_.'skrill_status`');
		return (parent::uninstall());
	}

	public function hookDisplayHeader($params)
	{
		return $this->hookHeader($params);
	}

	public function hookHeader($params)
	{
		$valid = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
						SELECT * FROM `'._DB_PREFIX_.'skrill_status`
						WHERE `next_retry` < '.time().' AND `status` = '.(int)Configuration::get('SKRILL_OS_PENDING'));

		foreach ($valid as &$pago)
		{
			$order = new Order($pago['id_order']);
			if (Validate::isLoadedObject($order))
			{
				if ($order->getCurrentState() == $pago['status'])
				{
					$result = $this->validateSkrill($pago['transaction_id']);
					if (isset($result['status']))
					{
						if ($result['status'] != $order->getCurrentState())
						{
							$order->setCurrentState($result['status']);
							$currency = new Currency($order->id_currency);
							$total_order = $order->total_paid_tax_incl;
							$fee = 100.0 / (100.0 - (float)self::$skrill_fee);
							$skrill_fee_trans = $this->get_rate('EUR', Tools::strtoupper($currency->iso_code)) * self::$skrill_fee_trans;
							$total = Tools::ps_round($fee * $total_order + (float)$skrill_fee_trans, 2);
							$total_fee = $total - $total_order;
							$message = new Message();
							$message->id_customer = (int)$order->id_customer;
							$message->message = "Transaction ID: {$pago['transaction_id']}\nWithout Fee: {$total_order} {$currency->iso_code}\nFee: {$total_fee} {$currency->iso_code}\nTotal Payment: {$result['price_skrill']} {$result['currency']}";
							$message->id_order = (int)$order->id;
							$message->private = true;
							$message->add();
						}
					}
				}
				Db::getInstance()->Execute('UPDATE `'._DB_PREFIX_.'skrill_status` SET `next_retry` = '.(time() + 6 * 60 * 60).', `status` = '.(int)$order->getCurrentState().' WHERE id = '.$pago['id']);
			}
		}
		return '';
	}

	public function hookDisplayPDFInvoice($params)
	{
		$order_invoice = $params['object'];
		if (!Validate::isLoadedObject($order_invoice) || !isset($order_invoice->id_order))
			return;
		$order = new Order((int)$order_invoice->id_order);
		$pago = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
						SELECT * FROM `'._DB_PREFIX_.'skrill_status`
						WHERE `id_order` = '.(int)$order->id);
		if (isset($pago[0]))
			$pago = $pago[0];
		if (!$pago || !isset($pago['transaction_id']))
			return '';
		$result = $this->validateSkrill($pago['transaction_id']);
		if ($result && isset($result['status']))
		{
			$currency = new Currency((int)$order->id_currency);
			$total_price = $order->total_paid_tax_incl;
			$diff = abs($total_price - $this->get_rate(Tools::strtoupper($result['currency']), Tools::strtoupper($currency->iso_code)) * $result['price_skrill']);
			$same_cur = Tools::strtoupper($result['currency']) == Tools::strtoupper($currency->iso_code);
			if ($same_cur && $diff > $total_price * 0.01 || !$same_cur && $diff > $total_price * 0.03)
				return '<b>'.$this->l('Commission for using Skrill:').'</b> '.Tools::displayPrice($diff, $currency).'<br /><b>'.$this->l('Total Payment on Skrill:').'</b> '.$result['price_skrill'].' '.$result['currency'];
		}
		return '';
	}
	public function hookPDFInvoice($params)
	{
		return $this->hookDisplayPDFInvoice($params);
	}
	public function hookOrderConfirmation($params)
	{
		if (!$this->active)
			return;

		if ($params['objOrder']->module != $this->name)
			return;

		switch ($params['objOrder']->getCurrentState())
		{
			case Configuration::get('SKRILL_OS_AUTHORIZATION'):
				$this->context->smarty->assign(array('status' => 'ok', 'id_order' => $params['objOrder']->id));
				break;
			case Configuration::get('SKRILL_OS_PENDING'):
				$this->context->smarty->assign(array('status' => 'pending', 'id_order' => $params['objOrder']->id));
				break;
			default:
				$this->context->smarty->assign('status', 'failed');
				break;
		}

		return $this->display(__FILE__, 'views/templates/hook/hookorderconfirmation.tpl');
	}

	private function validateMarchentSkrill($email, $secret, &$result)
	{
		if (!$email || empty($email) || !$secret || empty($secret))
			return false;

		$headers = array('User-Agent: '.$_SERVER['HTTP_USER_AGENT']);
		$query_url = 'https://www.skrill.com/app/query.pl?email='.urlencode($email).'&password='.md5($secret).'&action=history&start_date='.date('d-m-Y', strtotime('-2 day'));

		$ch = curl_init($query_url);
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		$result = curl_exec($ch);
		self::log('validateMarchentSkrill('.(bool)$secret.') -> '.print_r($result, true));
		preg_match('/\d{3}/', $result, $return_code);
		if (isset($return_code[0]) && $return_code[0] >= 400 && $return_code[0] < 600)
			return false;
		return true;
	}

	public function get_rate($from, $to)
	{
		if ($from == $to)
			return 1;

		if (isset(self::$skrill_convert[$from])
				&& isset(self::$skrill_convert[$from][$to])
				&& self::$skrill_convert[$from][$to]['time'] > time() - 60 * 60 * 12)
					return (float)self::$skrill_convert[$from][$to]['rate'];

		$headers = array(
				'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
				'Host:download.finance.yahoo.com',
				'Connection:keep-alive',
				'Connection:keep-alive',
				'User-Agent:'.$_SERVER['HTTP_USER_AGENT']
			);

		$ch = curl_init('http://download.finance.yahoo.com/d/quotes.csv?e=.csv&f=l1&s='.$from.$to.'=X');
		curl_setopt($ch, CURLOPT_HEADER, 0);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		$result = curl_exec($ch);
		self::$skrill_convert[$from][$to]['time'] = time();
		self::$skrill_convert[$from][$to]['rate'] = (float)$result;

		Configuration::updateValue('skrill_convert', Tools::jsonEncode(self::$skrill_convert));

		return self::$skrill_convert[$from][$to]['rate'];
	}

	private function preProcess()
	{
		if (Tools::isSubmit('skrill_marchent_email'))
		{
			self::$skrill_marchent_email = trim(Tools::getValue('skrill_marchent_email'));
			self::$skrill_marchent_mqi_secret = Tools::getValue('skrill_marchent_mqi_secret');
			self::$skrill_fee = (float)Tools::getValue('skrill_fee');
			self::$skrill_fee_trans = (float)Tools::getValue('skrill_fee_trans');

			Configuration::updateValue('skrill_marchent_email', self::$skrill_marchent_email);
			Configuration::updateValue('skrill_marchent_mqi_secret', self::$skrill_marchent_mqi_secret);
			Configuration::updateValue('skrill_fee', self::$skrill_fee);
			Configuration::updateValue('skrill_fee_trans', self::$skrill_fee_trans);
			$result = false;
			self::$skrill_verified = !empty(self::$skrill_marchent_email) && !empty(self::$skrill_marchent_mqi_secret) && $this->validateMarchentSkrill(self::$skrill_marchent_email, self::$skrill_marchent_mqi_secret, $result);
			Configuration::updateValue('skrill_verified', self::$skrill_verified?1:0);

			if (self::$skrill_verified)
				return '<ps-alert-success>'.$this->l('Updated successfully').'</ps-alert-success>';
			else
				self::$scrill_errors[] = $this->l('MQI Password is invalid').': '.$result;
		}
		return '';
	}

	public function validateSkrill($transaction_id = false)
	{
		if (!$transaction_id)
			return false;

		try
		{
			$payment_info = array();
			$headers = array('User-Agent: '.$_SERVER['HTTP_USER_AGENT']);
			$query_url = 'https://www.skrill.com/app/query.pl?email='.urlencode(self::$skrill_marchent_email).'&password='.md5(self::$skrill_marchent_mqi_secret).'&action=status_trn&trn_id='.urlencode($transaction_id);
			$ch = curl_init($query_url);
			curl_setopt($ch, CURLOPT_HEADER, 0);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
			$result = curl_exec($ch);
			self::log("validateSkrill($transaction_id) -> ".print_r($result, true));
			preg_match('/\d{3}/', $result, $return_code);
			switch ($return_code[0])
			{
				case '200' :
					$result = explode("\n", $result);
					$a_result = explode('&', $result[1]);
					foreach ($a_result as $value)
					{
						list ($parameter, $val) = explode('=', $value);
						$payment_info[$parameter] = urldecode($val);
					}
					break;
				case '401':
				case '402':
				case '403':
				case '404':
				case '405':
					$payment_info['status'] = 0;
					break;
				default :
					$payment_info['status'] = 0;
					break;
			}
		}
		catch (Exception $e)
		{
			return false;
		}

		$ret = array();
		switch ((int)$payment_info['status'])
		{
			case 2:
				$status_act = Configuration::get('SKRILL_OS_AUTHORIZATION');
				break;
			case -2:
				$status_act = Configuration::get('SKRILL_OS_REFUSED');
				break;
			default:
				$status_act = Configuration::get('SKRILL_OS_PENDING');
				break;
		}
		if (!isset($payment_info['mb_amount']))
			return $result;
		$skrill_fee_trans = $this->get_rate('EUR', Tools::strtoupper($payment_info['mb_currency'])) * self::$skrill_fee_trans;
		$fee = ((float)self::$skrill_fee) / 100.0;
		$ret['price'] = Tools::ps_round(((float)$payment_info['mb_amount']) - (((float)$payment_info['mb_amount'] - (float)$skrill_fee_trans) * (float)$fee), 2);
		$ret['price_skrill'] = (float)$payment_info['mb_amount'];
		$ret['currency'] = Tools::strtoupper($payment_info['mb_currency']);
		$ret['status'] = $status_act;
		$ret['cart_id'] = (int)$payment_info['cart_id'];
		$ret['message'] = Tools::jsonEncode($payment_info).'\n';

		return $ret;
	}

	private function _displayPresentation()
	{
		$out = '<ps-panel icon="icon-cogs" header="'.$this->l('Skrill Merchant Account').'">
			<ps-label-information label="'.$this->l('Configure your account').'">
			<p>
				'.$this->l('For a Skrill merchant account click on the following ')
				.' <a href="https://account.skrill.com/signup?type=business&locale=en" class="link" target="_blank" >&raquo; '.$this->l('Link').' &laquo;</a>
			</p>
			</ps-label-information>
			<ps-label-information label="'.$this->l('IMPORTANT Previous Steps').'">
			<ul>
				<li>'.$this->l('Step 1: Enabled and Change (or Add) Automated Payment Interface (API) IP to').' <span style="color:red">'.$_SERVER['SERVER_ADDR'].'</span> <a href="https://account.skrill.com/user_settings#!#developer_settings" target="_blank">'.$this->l('here').'</a></li>
				<li>'.$this->l('Step 2: Enabled and Change (or Add) Merchant Query Interface (MQI) IP to').' <span style="color:red">'.$_SERVER['SERVER_ADDR'].'</span> <a href="https://account.skrill.com/user_settings#!#developer_settings" target="_blank">'.$this->l('here').'</a></li>
				<li>'.$this->l('Step 3: Change MQI/API password').' <a href="https://account.skrill.com/user_settings#!#developer_settings" target="_blank">'.$this->l('here').'</a></li>
			</ul>
			<img width="100%" src="'.$this->_path.'views/img/help.png" /><br style="clear: both" />
		</ps-label-information><br style="clear: both" /></ps-panel><br style="clear: both" />';
		return $out;
	}

	public function getContent()
	{
		$ps_version = 1.6;
		if (version_compare(_PS_VERSION_, '1.6') < 0)
			$ps_version = 1.5;
		$str = '';
		if (count(self::$scrill_errors) > 0)
		{
			foreach (self::$scrill_errors as $error)
				$str .= '<ps-alert-error>'.$error.'</ps-alert-error>';
		}
		$str .= $this->preProcess();
		$str .= $this->_displayPresentation();
		$this->context->smarty->assign('ps_version', $ps_version);
		$this->context->smarty->assign('display_name', $this->displayName);
		$this->context->smarty->assign('skrill_marchent_email', self::$skrill_marchent_email);
		$this->context->smarty->assign('skrill_marchent_mqi_secret', self::$skrill_marchent_mqi_secret);
		$this->context->smarty->assign('skrill_fee', self::$skrill_fee);
		$this->context->smarty->assign('skrill_fee_trans', self::$skrill_fee_trans);
		$ui_riot   = '
						<script type="text/javascript" src="'.$this->_path.'views/js/riot.compiler.min.js"></script>
						<script type="text/javascript">
						riot.compile(function() {
						  var tags = riot.mount("*");
						});
						</script>';
		$ui_alerts = $this->display(__FILE__, 'views/templates/admin/prestui/ps-alert.tpl');
		$ui_form = $this->display(__FILE__, 'views/templates/admin/prestui/ps-form.tpl');
		$ui_panel = $this->display(__FILE__, 'views/templates/admin/prestui/ps-panel.tpl');
		$html = $this->display(__FILE__, 'views/templates/admin/config.tpl');
		return $str.$html.$ui_panel.$ui_form.$ui_alerts.$ui_riot;
	}

	public function hookPayment($params)
	{
		if (empty(self::$skrill_marchent_email) || empty(self::$skrill_marchent_mqi_secret))
			return '';

		$logo = false;
		if (version_compare(_PS_VERSION_, '1.5.0.5') < 0)
			$logo = Tools::getHttpHost(true, true)._PS_IMG_.'logo.jpg';
		else
			$logo = $this->context->link->getMediaLink(_PS_IMG_.Configuration::get('PS_LOGO'));
		if (Configuration::get('PS_SSL_ENABLED'))
			$logo = str_replace('http:', 'https:', $logo);
		if (stristr($logo, 'https:') === false && $logo != self::$skrill_logo_url)
		{
			$headers = array('User-Agent: '.$_SERVER['HTTP_USER_AGENT']);
			$query_url = 'https://cuado.co/skrill.php?new_url='.urlencode($logo);
			$ch = curl_init($query_url);
			curl_setopt($ch, CURLOPT_HEADER, 0);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
			curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
			$result = curl_exec($ch);
			$data = Tools::jsonDecode($result, true);
			if ($data && isset($data['new_id']))
			{
				Configuration::updateValue('skrill_logo_url', $logo);
				Configuration::updateValue('skrill_logo_id', (int)$data['new_id']);
				self::$skrill_logo_id = (int)Configuration::get('skrill_logo_id');
			}
		}

		$currency = new Currency((int)$params['cart']->id_currency);

		if (!in_array(Tools::strtoupper($currency->iso_code), self::$currency_accepted))
			return '';

		$lang = new Language((int)$params['cart']->id_lang);
		$customer = new Customer((int)$params['cart']->id_customer);
		$address = new Address((int)$params['cart']->id_address_invoice);
		//$country = new Country((int)$address->id_country, (int)$params['cart']->id_lang);
		//$products = $params['cart']->getProducts();
		$fee = 100.0 / (100.0 - (float)self::$skrill_fee);

		$skrill_fee_trans = $this->get_rate('EUR', Tools::strtoupper($currency->iso_code)) * self::$skrill_fee_trans;

		$skrill_params = array();

		$skrill_params['skrill_icon']		= self::$site_url.'modules/'.$this->name.'/views/img/skrill.gif';
		$skrill_params['success_url']		= self::$site_url.'modules/'.$this->name.'/return.php?id_cart='.$params['cart']->id;
		$skrill_params['failure_url']		= self::$site_url.'modules/'.$this->name.'/return.php';
		$skrill_params['pending_url']		= self::$site_url.'modules/'.$this->name.'/return.php';
		$skrill_params['valid_url']			= self::$site_url.'modules/'.$this->name.'/validation.php';
		$skrill_params['skrill_logo_url']	= stristr($logo, 'https:') === false?'https://cuado.co/skrill/'.self::$skrill_logo_id.'.png':$logo;

		$skrill_params['price']				= round($params['cart']->getOrderTotal(true, Cart::BOTH), 2);
		$skrill_params['price_skrill']		= round($fee * $params['cart']->getOrderTotal(true, Cart::BOTH) + (float)$skrill_fee_trans, 2);
		$skrill_params['currency_id']		= Tools::strtoupper($currency->iso_code);
		$skrill_params['lang_id']			= Tools::strtoupper($lang->iso_code);
		$skrill_params['item_id']			= $params['cart']->id;
		$skrill_params['fee']				= self::$skrill_fee;
		$skrill_params['fee_trans']			= $skrill_fee_trans;
		$skrill_params['customer']			= $customer;
		$skrill_params['marchent_email'] 	= self::$skrill_marchent_email;
		$skrill_params['feeTotal_no_trans']	= $fee * $params['cart']->getOrderTotal(true, Cart::BOTH) - $params['cart']->getOrderTotal(true, Cart::BOTH);
		$skrill_params['feeTotal']			= $skrill_params['price_skrill'] - $params['cart']->getOrderTotal(true, Cart::BOTH);

		/* About the merchant */
		$skrill_params['recipient_description'] = Configuration::get('PS_SHOP_NAME');

		/* About the customer */
		$skrill_params['pay_from_email'] = $customer->email;
		$skrill_params['firstname'] = $address->firstname;
		$skrill_params['lastname'] = $address->lastname;
		$skrill_params['address'] = $address->address1;
		$skrill_params['address2'] = $address->address2;
		$skrill_params['phone_number'] = !empty($address->phone_mobile) ? $address->phone_mobile : $address->phone;
		$skrill_params['postal_code'] = $address->postcode;
		$skrill_params['city'] = $address->city;
		$country = new Country((int)($address->id_country), Configuration::get('PS_LANG_DEFAULT'));
		$skrill_params['country'] = isset(self::$ps_to_skrill_country[Tools::strtoupper($country->iso_code)]) ? self::$ps_to_skrill_country[Tools::strtoupper($country->iso_code)] : '';
		$skrill_params['date_of_birth'] = Tools::substr($customer->birthday, 5, 2).Tools::substr($customer->birthday, 8, 2).Tools::substr($customer->birthday, 0, 4);
		$this->context->smarty->assign($skrill_params);
		return $this->display(__FILE__, 'views/templates/hook/payment.tpl');
	}
}
