<?php
require_once "lib/itaushopline/class.itau.php";
class ControllerPaymentItauShopline extends Controller {

	public function index() {
		$language = $this->language->load('payment/itaushopline');
		$data = array_merge($this->data, $language);
		$this->load->type('tipoitaushopline');

		$data['button_confirm'] = 'Confirmar';
		$data['button_back']    = 'Voltar';
		$this->id               = 'payment';

		$this->load->dmodel('checkout/order');
		$order_info             = $this->dmodel_checkout_order->getOrder($this->session->data['order_id']);
		$data['pedido']         = $order_info['order_id'];
		$data['desconto']       = $this->config->get('itaushopline_desconto');
		$data['valorpedido']    = $order_info['total'];
		$data['back']           = $this->url->link('checkout/payment&pedido='.$this->session->data['order_id'].'');
		$data['continue']       = $this->url->link('checkout/success&pedido='.$this->session->data['order_id'].'');
		$data['config_ssl']            = $this->config->get('config_ssl');

		if (isset($this->session->data['order_id'])){
			$data['idorder']               = $this->session->data['order_id'];
		}
		$data['back']       = $this->url->link('checkout/checkout', '', 'SSL');
		$data['continue']   = $this->url->link('checkout/success');

		$data['url_itau_confirm'] = $this->config->get('config_ssl').'index.php?route=payment/itaushopline/confirm';


		if ($this->config->get('itaushopline_tipo_finalizacao') == Type_ItauShoplineTipoFinalizacao::Tp_ItauShoplineFinalCheckout){
			$msg = '<center><br><h2>Obrigado pelo Pedido</h2>';
			$msg .= '<a onclick="javascript:window.open(\''.$this->config->get('config_ssl').'lib/itaushopline/pagar.php?pedido='.$data['pedido'].'\',\'popup\',\'width=800,height=800\');vai();" href="javascript:void(0);">
			<img src="'.$this->config->get('config_ssl').'lib/itaushopline/images/pg.png" border="0"></a>';
			$msg .= '<br><br>Clique acima para Realizar o Pagamento.</center>';
		}else{
			$msg = '<div class="column-12">';
			$msg .= '<div class="buttons column-12">';
			$msg .= '  <button id="button-confirm-posterior"  class="btn-default btn-large"><span>' . $data['button_pagamentopos'] . '</span></button>';
			$msg .= '</div>';
			$msg .= '</div>';
		}
		$data['msg_itau_confirm'] = $msg;




		if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/itaushopline.twig')) {
			$tema = $this->config->get('config_template') . '/template/payment/itaushopline.twig';
		} else {
			$tema = 'default/template/payment/itaushopline.twig';
		}
		$this->data = $data;
		// Fix do Fix
		$this->app();
		$this->template = $tema;
		$this->response->setOutput($this->render());
		//$this->render('payment/itaushopline');
	}

	public function pagarPosteriormente() {
		$json = array();
		$language = $this->language->load('payment/itaushopline');
		$this->data = array_merge($this->data, $language);
		$this->load->type('tipocieloapi');
		$this->load->dmodel('checkout/order');
		$this->load->model('payment/itaushopline');
		$this->dmodel_checkout_order->confirm($this->session->data['order_id'], $this->config->get('itaushopline_order_status_posterior_id'), $this->data['text_coment_pagamentoposterior']);
		$this->data['continue'] = $this->url->link('checkout/success');

		$this->response->setOutput(json_encode($json));
	}

	public function confirm() {
		$language = $this->language->load('payment/itaushopline');
		$this->data = array_merge($this->data, $language);

		$this->load->dmodel('checkout/order');
		//$comment  = "Ita&uacute; Shopline";
		$comment = $this->config->get('config_ssl').'lib/itaushopline/pagar.php?pedido='.$this->session->data['order_id'];
		$this->dmodel_checkout_order->confirm($this->session->data['order_id'], $this->config->get('itaushopline_padrao'), $comment);
		$this->cart->clear();
		$ouput = "<script>window.location = '".$this->config->get('config_ssl')."index.php?route=checkout/success';</script>";
		$this->response->setOutput($ouput);
	}

	public function retorno() {

		if(!$this->config->get('itaushopline_status')){
			throw new Exception('Configuração de verificação de retorno de pedidos do itaushopline esta desabilitada!');
		}

		$language = $this->language->load('payment/itaushopline');
		$this->data = array_merge($this->data, $language);
		$this->load->dmodel('checkout/order');
		//faz as consultas
		$criptos = new Itaucripto();
		$codigo = strtoupper(trim($this->config->get('itaushopline_afiliacao')));
		$chave = strtoupper(trim($this->config->get('itaushopline_chave')));
		if(isset($_GET['DC'])){
			$descripto = $criptos->decripto($_GET['DC'], $chave);
			$cod = $criptos->geraConsulta($codigo, (int)$criptos->retornaPedido(), 1, $chave);

			$resultado = $this->ConItau("https://shopline.itau.com.br/shopline/consulta.aspx?DC=".$cod."");

			$lastStatus = $this->dmodel_checkout_order->getLastPaymentStatusHistory((int)$criptos->retornaPedido());
			if( !$lastStatus || (isset($resultado['sitPag']) && $resultado['sitPag'] <> $lastStatus['status'])  ){
				//de acordo o tipo de pagamento
				switch($resultado['sitPag']){
					//pagamento aceito
					case '00': $this->dmodel_checkout_order->update((int)$criptos->retornaPedido(), $this->config->get('itaushopline_pago'), "Pago");
					break;
					case '05':
					case '06':
					$this->dmodel_checkout_order->update((int)$criptos->retornaPedido(), $this->config->get('itaushopline_padrao'), "Aguardando");
					break;
					case '03':
					$this->dmodel_checkout_order->update((int)$criptos->retornaPedido(), $this->config->get('itaushopline_cancelado'), "Cancelado");
					break;
				}
				$ordem = isset($lastStatus['ordem']) ? $lastStatus['ordem']+1 : 0;
				$this->dmodel_checkout_order->insertPaymentStatusHistory((int)$criptos->retornaPedido(),$resultado['sitPag'],$ordem);
			}

		}

		//redireciona os pedidos
		$ouput = "<script>window.location = '".$this->config->get('config_ssl')."index.php?route=account/order';</script>";
		$this->response->setOutput($ouput);
	}

	public function cron(){


		if($this->config->get('itaushopline_status')){

			$this->load->dmodel('setting/task');
			$this->load->type('tipocomum');

			$result =	$this->dmodel_setting_task->getTaskByType(Type_TaskUrl::Tp_TaskShopLineSonda);
			$time   = (($result['time_execution']*60) - 60);
			ini_set('max_execution_time', $time);

			$data = array(
				'date_last_acting' => $this->db->dataAtual(),
				'type' => Type_TaskUrl::Tp_TaskShopLineSonda
			);
			$this->dmodel_setting_task->editDateTaskByType($data);

			$criptos = new Itaucripto();
			$this->load->dmodel('checkout/order');

			//dados cadastro cliente itau
			$codigo = strtoupper(trim($this->config->get('itaushopline_afiliacao')));
			$chave = strtoupper(trim($this->config->get('itaushopline_chave')));
			$pedidoPadrao = $this->config->get('itaushopline_padrao');
			$order_query = $this->db->query("SELECT * FROM `" . DB_PREFIX . "order` WHERE payment_code = 'itaushopline' AND order_status_id = '".(int)$pedidoPadrao."'");

			//se houver pedidos
			if ($order_query->num_rows) {
				foreach ($order_query->rows as $pedido) {
					$cod = $criptos->geraConsulta($codigo, $pedido['order_id'], 1, $chave);
					if(!empty($cod)){
						$resultado = $this->ConItau("https://shopline.itau.com.br/shopline/consulta.aspx?DC=".$cod."");

						$lastStatus = $this->dmodel_checkout_order->getLastPaymentStatusHistory($pedido['order_id']);
						if( !$lastStatus || (isset($resultado['sitPag']) && $resultado['sitPag'] <> $lastStatus['status'])  ){
							echo 'Consulta fatura relacionado ao pedido #'.$pedido['order_id'].' encontra-se no status status '.$resultado['sitPag'].'!<br>';
							//de acordo o tipo de pagamento
							switch($resultado['sitPag']){
								//pagamento aceito
								case '00': $this->dmodel_checkout_order->update($pedido['order_id'], $this->config->get('itaushopline_pago'), "Pago");
								break;
								case '05':
								case '06':
								$this->dmodel_checkout_order->update($pedido['order_id'], $this->config->get('itaushopline_padrao'), "Aguardando");
								break;
								case '03':
									if (!$this->config->get('itaushopline_dias_cancelamento_naolocalizado')){
										$periodocancelamento = 3;
									}else{
										$datapedido = new DateTime(date('Y/m/d',strtotime($pedido['date_added'])));
										$dataatual = new DateTime(date('Y/m/d'));
										$periodocancelamento = date_diff($datapedido, $dataatual)->d;
									}


									if ($this->config->get('itaushopline_dias_cancelamento_naolocalizado') < $periodocancelamento ){
										$this->dmodel_checkout_order->update($pedido['order_id'], $this->config->get('itaushopline_cancelado'), "Cancelado");
									}

								break;
							}
							$ordem = isset($lastStatus['ordem']) ? $lastStatus['ordem']+1 : 0;
							$this->dmodel_checkout_order->insertPaymentStatusHistory($pedido['order_id'],$resultado['sitPag'],$ordem);
						}
					}
				}
			}
		}

	}

	public function ConItau($url){
		//solicitacao
		$curl = curl_init();
		curl_setopt( $curl , CURLOPT_HEADER , 0 );
		curl_setopt( $curl , CURLOPT_SSL_VERIFYPEER, 0);
		curl_setopt( $curl , CURLOPT_RETURNTRANSFER , 1 );
		curl_setopt( $curl , CURLOPT_URL , $url );
		$xml = curl_exec( $curl );
		curl_close( $curl );
		$dados = array();
		libxml_use_internal_errors(true);
		$DadosEnvio= simplexml_load_string($xml);
		if(!isset($DadosEnvio->PARAMETER)){
			return false;
		}
		$Arr = $this->simpleXMLToArray($DadosEnvio);
		if(is_array($Arr)){
			foreach($Arr['PARAMETER']['PARAM'] AS $key=>$valor){
				$dados[$valor['ID']] = $valor['VALUE'];
			}
			return $dados;
		}else{
			return false;
		}
	}

	public function simpleXMLToArray($xml,
	$flattenValues=true,
	$flattenAttributes = true,
	$flattenChildren=true,
	$valueKey='@value',
	$attributesKey='@attributes',
	$childrenKey='@children'){

		$return = array();
		if(!($xml instanceof SimpleXMLElement)){return $return;}
		$name = $xml->getName();
		$_value = trim((string)$xml);
		if(strlen($_value)==0){$_value = null;};

		if($_value!==null){
			if(!$flattenValues){$return[$valueKey] = $_value;}
			else{$return = $_value;}
		}

		$children = array();
		$first = true;
		foreach($xml->children() as $elementName => $child){
			$value = $this->simpleXMLToArray($child, $flattenValues, $flattenAttributes, $flattenChildren, $valueKey, $attributesKey, $childrenKey);
			if(isset($children[$elementName])){
				if($first){
					$temp = $children[$elementName];
					unset($children[$elementName]);
					$children[$elementName][] = $temp;
					$first=false;
				}
				$children[$elementName][] = $value;
			}
			else{
				$children[$elementName] = $value;
			}
		}
		if(count($children)>0){
			if(!$flattenChildren){$return[$childrenKey] = $children;}
			else{$return = array_merge($return,$children);}
		}

		$attributes = array();
		foreach($xml->attributes() as $name=>$value){
			$attributes[$name] = trim($value);
		}
		if(count($attributes)>0){
			if(!$flattenAttributes){$return[$attributesKey] = $attributes;}
			else{$return = array_merge($return, $attributes);}
		}

		return $return;
	}

	public function app() {
    $this->document->addScriptApp(array(
      'catalog/view/theme/appmobile/js/payment.itaushopline.js'
    ));
    $this->data['scriptsApp'] = json_encode($this->document->getScriptsApp());
  }
}
