<?php
$loader = $this->registry->get('load');
$loader->controller('payment/payment_info');
$loader->controller('payment/clearsale');

class ControllerPaymentRedeCredito extends ControllerPaymentPaymentInfo
{
    private $error = array();

    public function credit_card()
    {
        $this->app();

        $language = $this->language->load('payment/rede');
        $this->data = array_merge($this->data, $language);

        $this->load->type('tiporede');
        $this->load->type('tipoclearsale');

        if (isset($this->session->data['order_id'])) {
            $this->data['idorder'] = $this->session->data['order_id'];
        }

        if (isset($this->session->data['payment_method']['code_type']) && isset($this->session->data['payment_method']['code'])) {
            $code_type = $this->session->data['payment_method']['code_type'];
            $code = $this->session->data['payment_method']['code'];

            $this->data['paymentRoute'] = "$code/pay_$code_type";
            $this->data['paymentName'] = $code;
        }

        $this->data['back'] = $this->url->link('checkout/checkout', '', 'SSL');
        $this->data['continue'] = $this->url->link('checkout/success');
        $this->id = 'payment';
        $this->data['payment_address'] = false;
        $this->data['captcha_tpl'] = $this->getChild('payment/captcha');

        if ($this->config->get('clearsale_status') && in_array($this->config->get('clearsale_tipo_integracao'), array(Type_ClearSaleIntegracao::Tp_Total, Type_ClearSaleIntegracao::Tp_TotalGarantido))
            && in_array($this->config->get('rede_anti_fraude'), array(Type_AntiFraudeCheckout::Tp_CleaSaleTotal))) {
            $setting = [
                'payment_name' => 'clearsale'
            ];
            $this->data['payment_address'] = $this->getChild('payment/clearsale_payment_address', $setting);
        }

        if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/payment/rede/rede_credito.twig')) {
            $this->template = $this->config->get('config_template') . '/template/payment/rede/rede_credito.twig';
        } else {
            $this->template = 'default/template/payment/rede/rede_credito.twig';
        }

        $order_info = $this->dmodel_checkout_order->getOrder($this->session->data['order_id']);
        $this->data['credit_cards'] = ftr_geral::getPaymentMethods($this->config->get('rede_credit_card'), $order_info['total']);

        $this->data['rede_parcela_qtdmax'] = $this->config->get('rede_parcela_qtdmax');

        $this->session->data['rede_retentativa'] = 0; //controla a quantidade de tentativas

        $this->response->setOutput($this->render('payment/rede/rede_credito'));
    }

    public function pay_credit_card()
    {
        $json = array();
        $this->load->language('payment/rede');
        $this->load->type('tiporede');
        $json['error'] = parent::validate();
        
        if (!$json['error']) {
         
            ini_set("allow_url_fopen", 1);
            $this->load->dmodel('payment/payment_info');
            $this->load->dmodel('checkout/order');

            $redeOrderID = $this->dmodel_payment_payment_info->getPaymentInfo($this->session->data['order_id'], Type_PagamentoTabela::Tp_Cartao, true);

            if (!$redeOrderID) {//validação para não deixar duplicar o pagamento
                function cartaocreditoADS($string)
                {
                    $string = str_replace('+', '', $string);
                    $string = str_replace(' ', '', $string);
                    return $string;
                }

                function TidADS($string)
                {
                    $string = str_replace('<br/>', '', $string);
                    return $string;
                }

                function MaskCard($tamanho, $inicio = '', $fim = '')
                {
                    $numMask = $tamanho - (strlen($inicio) + strlen($fim));
                    $string = $inicio;
                    for ($cont = 0; $cont < $numMask; $cont++) {
                        $string .= '*';
                    }
                    $string .= $fim;
                    return $string;
                }

                $order_info = $this->dmodel_checkout_order->getOrder($this->session->data['order_id']);
                $validade = explode("/", $this->request->post['expire']);
                $cartaocredito = cartaocreditoADS($this->request->post['creditcard_ccno']);

                $parcelas = $this->request->post['qtd_parcela'];
                $valor = $this->request->post['formaPagamento'];

                $cartao_recalculo = $this->parcelamento(Type_CreditCardModule::getNickFromConstValue(Type_CreditCardModule::Rede),false);//calcula novamente as parcelas para evitar que venha valor modificado do javascript

                $valor = $cartao_recalculo[$parcelas]['valor_parcela'];

                $juros_parcela = 0;
                $desconto_parcela = 0;
                if (isset($cartao_recalculo[$parcelas]['valor_parcela'])) {
                  $total_parcelas = $cartao_recalculo[$parcelas]['valor_parcela'] * $parcelas;
                  if ($total_parcelas > $order_info['total']) {
                    $juros_parcela = number_format($total_parcelas - $order_info['total'], 2, '.', '');
                  }else if ($total_parcelas < $order_info['total']) {
                    $desconto_parcela = ($order_info['total']-$total_parcelas)*-1;
                  }
                }

                $vvalorPedido = number_format($valor * $parcelas, 2, '.', '');

                $dadosTransacao = array(
                    'order_id' => $this->session->data['order_id'],
                    'cliente_ip' => $this->request->server['REMOTE_ADDR'],
                    'total_pedido' => $vvalorPedido,
                    'cartao_cod' => $this->request->post['creditcard_cccvd'],
                    'cartao_mes' => $validade[0],
                    'cartao_ano' => $validade[1],
                    'cartao_numero' => $cartaocredito,
                    'cartao_nome' => $this->request->post['creditcard_name'],
                    'cartao_parcelas' => $parcelas,
                    'cartao_bandeira' => $this->request->post['creditcard_cctype']
                );

                if (($cartaocredito <> '')) {
                    $retornoTransacao = $this->rede->redePagamentoCartaoCredito($dadosTransacao);
                    if (!isset($retornoTransacao['error'])) {
                        $cartaoMascarado = MaskCard(strlen($cartaocredito), $retornoTransacao['inicioNumCartao'], $retornoTransacao['ultimosNumCartao']);
                        $mensagemTraduzida = (Type_RedeRetorno::getNickFromConstValue($retornoTransacao['codRetorno']) !== null) ? Type_RedeRetorno::getNickFromConstValue($retornoTransacao['codRetorno']) : 'Cod.:' . $retornoTransacao['codRetorno'] . ' - Não foi possivel concluir a transação';
                        if ($retornoTransacao['codRetorno'] == Type_RedeRetorno::Tp_RedeRetorno00 || $retornoTransacao['codRetorno'] == '220'/*Aguardando autenticação*/) {
                            $autoricao = Type_RedeAutorizacao::Tp_RedeAutorizada;
                            if ($retornoTransacao['status_captura'] == Type_PagamentoStatusCaptura::Tp_Capturado) {
                                $statusPagamento = Type_RedeStatusPgto::Tp_RedePago;
                                $statusOrder = $this->config->get('rede_order_status_id');
                            } else {
                                $statusPagamento = Type_RedeStatusPgto::Tp_RedeAutorizado;
                                $statusOrder = $this->config->get('rede_order_au_id');
                            }
                        } else {
                            $autoricao = Type_RedeAutorizacao::Tp_RedeNegada;
                            $statusPagamento = Type_RedeStatusPgto::Tp_RedeNegado;
                            $statusOrder = $this->config->get('rede_order_ne_id');
                        }

                        $this->session->data['rede_TID'] = $retornoTransacao['tid'];
                        $this->session->data['rede_Retorno'] = $mensagemTraduzida;
                        $json['SUCCESS']['TID'] = $retornoTransacao['tid'];
                        $json['SUCCESS']['MENSAGEM'] = $mensagemTraduzida;

                        $paymentinfo = array();
                        $paymentinfo['order_id'] = $this->session->data['order_id'];
                        $paymentinfo['valor_pagamento'] = $vvalorPedido;
                        $paymentinfo['qtd_parcela'] = $parcelas;
                        $paymentinfo['cartao_mascara'] = $cartaoMascarado;
                        $paymentinfo['status_pagamento'] = $statusPagamento;
                        $paymentinfo['tipo_cartao'] = Type_Card::Tp_Credito;
                        $paymentinfo['cod_retorno'] = $retornoTransacao['codRetorno'];
                        $paymentinfo['mensagem_retorno'] = $mensagemTraduzida;
                        $paymentinfo['payment_id'] = $retornoTransacao['referencia'];
                        $paymentinfo['cod_autorizacao'] = $retornoTransacao['codAutorizacao'];
                        $paymentinfo['tid'] = $retornoTransacao['tid'];
                        $paymentinfo['nsu'] = $retornoTransacao['nsu'];
                        $paymentinfo['data_pagamento'] = !is_null($retornoTransacao['dataTransacao']) ? $retornoTransacao['dataTransacao']->format('Y-m-d H:i:s') : date('Y-m-d H:i:s');
                        $paymentinfo['status_captura'] = $retornoTransacao['status_captura'];
                        $paymentinfo['idioma'] = 'BR';
                        $paymentinfo['moeda'] = 'BRL';
                        $paymentinfo['cartao_bandeira'] = Type_RedeBandeira::getConstFromNickValue(strtolower($this->request->post['creditcard_cctype']));
                        $paymentinfo['cartao_bandeira_text'] = ucfirst($this->request->post['creditcard_cctype']);

                        $this->dmodel_payment_payment_info->addPaymentCreditCard($paymentinfo);

                        $json['redirect'] = $this->url->link('checkout/success');

                        $this->session->data['rede_confirmacao'] = $autoricao;
                        $this->dmodel_checkout_order->confirm($this->session->data['order_id'], $statusOrder);

                        switch($cartao_recalculo[$parcelas]['tipo_calculo']){
                            case Type_CalculoParcelamento::Desconto :
                                $this->dmodel_checkout_order->InsertOrderTotal($this->session->data['order_id'], array(
                                    'module_code' => 'rede_api_desconto',
                                    'module_title' => 'Desconto Rede (' . $cartao_recalculo[$parcelas]['percentual_calculo'] . '%)',
                                    'value' => $desconto_parcela,
                                    'order' => '2'
                                ));
                                $this->dmodel_checkout_order->updateTotalOrder($this->session->data['order_id'], $vvalorPedido);
                                $this->dmodel_checkout_order->updateApportionment($this->session->data['order_id'],($desconto_parcela*-1),Type_Apportionment::Discount);
                            break;
                            case Type_CalculoParcelamento::Juros :
                                $this->dmodel_checkout_order->InsertOrderTotal($this->session->data['order_id'], array(
                                    'module_code' => 'rede_api_acrescimo',
                                    'module_title' => 'Acréscimo Rede (' . $cartao_recalculo[$parcelas]['percentual_calculo'] . '% de juros ao mês no parcelamento)',
                                    'value' => $juros_parcela,
                                    'order' => '2'
                                ));
                                $this->dmodel_checkout_order->updateTotalOrder($this->session->data['order_id'], $vvalorPedido);
                                $this->dmodel_checkout_order->updateApportionment($this->session->data['order_id'],$juros_parcela,Type_Apportionment::Increase);
                            break;
                        }


                        if ($this->config->get('clearsale_status') && in_array($this->config->get('clearsale_tipo_integracao'), array(Type_ClearSaleIntegracao::Tp_Total, Type_ClearSaleIntegracao::Tp_TotalGarantido))
                            && in_array($this->config->get('rede_anti_fraude'), array(Type_AntiFraudeCheckout::Tp_CleaSaleTotal))) {
                            /* A verificaçãod e fraude é feita apenas quando o pagamento é autorizado */
                            $controllerClearsale = new ControllerPaymentClearsale($this->registry);
                            $this->load->dmodel('account/order');
                            $this->request->post['qtd_parcela'] = $parcelas;
                            $this->request->post['shipping_address_id'] = $this->session->data['shipping_address_id'];
                            $dataInfos = array();
                            $dataInfos['order_info'] = $order_info;
                            $dataInfos['payment_info'] = $this->request->post;
                            $dataInfos['transaction_return'] = $retornoTransacao;
                            $dataInfos['products'] = $this->dmodel_account_order->getOrderProducts($this->session->data['order_id']);
                            $controllerClearsale->setNewOrder($dataInfos);
                        }
                    } else {
                        $autoricao = Type_RedeAutorizacao::Tp_RedeRetentativa;
                        $json['error']['retorno_api'] = array(
                            "descricao" => $retornoTransacao['error'],
                            "mensagem"  => $this->language->get('text_erro_retorno')
                        );
                    }
                } else {
                    $autoricao = Type_RedeAutorizacao::Tp_RedeNegada;
                    $this->dmodel_checkout_order->confirm($this->session->data['order_id'], $this->config->get('rede_order_ne_id'), '');
                    $json['redirect'] = $this->url->link('checkout/success');
                }
            } else {
                $autoricao = Type_RedeAutorizacao::Tp_RedeAutorizada;
            }
            $json['autorizacao'] = $autoricao;
            http_response_code(200);
        } else {
            if (isset($this->error['error_bandeira'])) {
                $json['error']['bandeira'] = $this->error['error_bandeira'];
            }
            if (isset($this->error['error_nomecartao'])) {
                $json['error']['nomecartao'] = $this->error['error_nomecartao'];
            }
            if (isset($this->error['error_numerocartao'])) {
                $json['error']['numerocartao'] = $this->error['error_numerocartao'];
            }
            if (isset($this->error['error_csv'])) {
                $json['error']['csv'] = $this->error['error_csv'];
            }
            if (isset($this->error['error_validade'])) {
                $json['error']['validade'] = $this->error['error_validade'];
            }
          http_response_code(404);
        }

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


    public function validate()
    {
        $this->load->controller('payment/rede_credito_payment_address');
        $error = array();

        if (!isset($this->request->post['creditcard_cctype'])) {
            $error['error_bandeira'] = $this->language->get('error_bandeira');
        }
        if (!isset($this->request->post['creditcard_name']) || strlen($this->request->post['creditcard_name']) == 0) {
            $error['error_nomecartao'] = $this->language->get('error_nomecartao');
        }
        if (!isset($this->request->post['creditcard_ccno']) || strlen($this->request->post['creditcard_ccno']) == 0) {
            $error['error_numerocartao'] = $this->language->get('error_numerocartao');
        }
        if (!isset($this->request->post['creditcard_cccvd']) || strlen($this->request->post['creditcard_cccvd']) == 0) {
            $error['error_csv'] = $this->language->get('error_csv');
        }
        if (!isset($this->request->post['expire']) || (strlen($this->request->post['expire']) == '') || (strlen($this->request->post['expire']) != 7/*99/9999*/)) {
            $error['error_validade'] = $this->language->get('error_validade');
        }

        $controllerPaymentPaymentAddress = new ControllerPaymentPaymentAddress($this->registry);
        $validate = $controllerPaymentPaymentAddress->validate();

        $error = ($validate) ? array_merge($validate, $error) : $error;

        if ($error) {
            return $error;
        } else {
            return false;
        }
    }

    public function success()
    {
        if (isset($this->session->data['payment_session']['payment_method']['code']) && ($this->session->data['payment_session']['payment_method']['code'] == Type_YapayConfigs::Tp_NameModule)) {
            $this->load->dmodel('payment/payment_info');
            $this->load->language('payment/' . $this->session->data['payment_session']['payment_method']['code']);

            switch ($this->session->data['payment_session']['payment_method']['code_type']) {
                case Type_PaymentOption::Tp_CreditCard:
                    $query = $this->db->query('SELECT * FROM oc_rede_order WHERE order_id = ' . $this->session->data['payment_session']['order_id'])->row;
                    if (!$query) {
                        return false;
                    }
                    $this->data['tid'] = $query['tid'];
                    $this->data['text_message_credit_card'] = $this->language->get('text_message_credit_card');

                    $this->load->dmodel('checkout/order');
                    $order_info = $this->dmodel_checkout_order->getOrder($this->session->data['payment_session']['order_id']);
                    $status_info = $this->dmodel_checkout_order->getOrderStatus($order_info['order_status_id']);
                    $this->data['status_descricao'] = $status_info['descricao'];
                    break;
            }

            $this->template = $this->config->get('config_template') . '/template/success/' . $this->session->data['payment_session']['payment_method']['code_type'] . '.twig';
            $this->response->setOutput($this->render());
        } else {
            return false;
        }
    }

    public function parcelamento($module='rede',$html = true,$flag_params=array())
    {
        return parent::parcelamento($module,$html,$flag_params);
    }

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