<?php

class ControllerCheckoutSuccess extends Controller
{
    public function index()
    {
        $this->load->helper('ftr_geral');

        $this->load->library('google_tracking_code');

        $google_tracking_code = new GoogleTrackingCode($this->registry);

        if (!$this->customer->isLogged()) {
            $this->redirect($this->url->link('account/logout', '', 'SSL'));
        }

        $this->document->addScript([
            'public/js/checkout/success.js',
            'public/js/checkout/schedule.js'
        ]);

        if (isset($this->session->data['order_id'])) {
            /*
            * sempre que tem um pedido novo reseta as informações da payment_session
            * sessão criada para não perder os dados do pedido caso o cliente de f5 na tela de sucesso.
            */
            unset($this->session->data['payment_session']);
            $this->session->data['payment_session'] = array(
                'order_id' => $this->session->data['order_id'],
                'code' => isset($this->session->data['payment_method']['code']) ? $this->session->data['payment_method']['code'] : false,
                'code_type' => isset($this->session->data['payment_method']['code_type']) ? $this->session->data['payment_method']['code_type'] : false,
                'title' => isset($this->session->data['payment_method']['title']) ? $this->session->data['payment_method']['title'] : false
            );

            $transaction = $this->getTransactionJs($this->session->data['order_id']);
            $transactionItens = $this->getTransactionItensJs($this->session->data['order_id']);
            $google_analytics = $google_tracking_code->getGATrackingCodes();
            
            $this->load->dmodel('account/order');
            $this->load->model('account/order');
            $this->load->model('account/customer');

            $order = $this->model_account_order->getOrder($this->session->data['order_id']);
            $products = $this->dmodel_account_order->getOrderProducts($this->session->data['order_id']);
            $customer = $this->model_account_customer->getCustomer($order['customer_id']);

            $currentDate = date('Y-m-d');
            $estimated_delivery_date = date('Y-m-d', strtotime($currentDate . ' + 10 days'));

            if($this->config->get('google_merchant_center_status')){
                $this->data['google_merchant_center_status'] = $this->config->get('google_merchant_center_status');
                $this->data['google_merchant_center_merchant_id'] = $this->config->get('google_merchant_center_id');
                $this->data['google_merchant_center_order_id'] = $order['order_id'];
                $this->data['google_merchant_center_email'] = $customer['email'];
                $this->data['google_merchant_center_country'] = $this->config->get('google_merchant_center_country');
                $this->data['google_merchant_center_delivery_date'] = $estimated_delivery_date;
                $this->data['google_merchant_center_opt_in_style'] = $this->config->get('google_merchant_center_opt_in_style');
            }else{
                $this->data['google_merchant_center_status'] = null;
            }

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

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

                $product_name = '';
                $product_quantity = '';
                $product_value = '';
                $product_sku = '';
                $product_ean13 = '';

                foreach ($products as $product) {
                    $product_name .= urlencode($product['name']) . '|';
                    $product_quantity .= $product['quantity'] . '|';
                    $product_value .= $product['price'] . '|';
                    $product_sku .= $product['model'] . '|';
                    if (ftr_geral::isEAN13($product['codigo_barra'])) {
                        $product_ean13 .= $product['codigo_barra'] . '|';
                    } else {
                        $product_ean13 .= '|';
                    }
                }

                $product_name = substr($product_name, 0, -1);
                $product_quantity = substr($product_quantity, 0, -1);
                $product_value = substr($product_value, 0, -1);
                $product_sku = substr($product_sku, 0, -1);
                $product_ean13 = substr($product_ean13, 0, -1);

                $this->data['certificate_ebit_info'] = array(
                    'email' => $order['email'],
                    'gender' => $customer['sexo'],
                    'birthDay' => implode('-', array_reverse(explode('-', $customer['data_nascimento']))),
                    'zipCode' => $order['payment_postcode'],
                    'mktSaleID' => 0,
                    'deliveryTax' => $order['shipping_value'],
                    'totalSpent' => $order['total'],
                    'value' => $product_value,
                    'quantity' => $product_quantity,
                    'productName' => $product_name,
                    'transactionId' => $order['order_id'],
                    'eanCode' => $product_ean13,
                    'sku' => $product_sku,
                    'storeId' => $this->config->get('certificate_ebit_store_id'),
                    'plataform' => 0
                );
            }

            $this->cart->clear();

            $sessionCodeType = $this->session->data['payment_method']['code_type'] ?? null;

            if ($sessionCodeType === 'pix') {
                $this->session->data['pixSessionData'] = $sessionCodeType;
            }

            unset($this->session->data['shipping_method']);
            unset($this->session->data['shipping_methods']);
            unset($this->session->data['payment_method']);
            unset($this->session->data['payment_methods']);
            unset($this->session->data['guest']);
            unset($this->session->data['comment']);
            unset($this->session->data['order_id']);
            unset($this->session->data['coupon']);
            unset($this->session->data['reward']);
            unset($this->session->data['voucher']);
            unset($this->session->data['vouchers']);


        } else {

            $transaction = false;
            $transactionItens = false;
            $google_analytics = false;
        }


        if (isset($this->session->data['payment_session']['order_id'])) {

            if ((isset($this->session->data['cielotransparente_confirmacao'])) && ($this->config->get('cielo_transparente_status'))) {
                $this->load->model('payment/cielo_transparente');

                if ($this->session->data['cielotransparente_confirmacao'] == Type_StCieloPagamento::Tp_CieloPago) {
                    $this->data['OrderCielo_titulo'] = 'Seu pedido foi aprovado!';
                    $this->data['OrderCielo_mensagem'] = '<p>O pagamento foi aprovado pela operadora do cartão de crédito:</p><p>' . $this->session->data['cielotransparente_LR'] . ' - TID : ' . $this->session->data['cielotransparente_TID'] . '</p>';
                } else {
                    $this->data['OrderCielo_titulo'] = 'Seu pedido não foi aprovado!';
                    $this->data['OrderCielo_mensagem'] = '<p>O pagamento não foi aprovado pela operadora do cartão de crédito:</p><p>' . $this->session->data['cielotransparente_LR'] . ' - TID : ' . $this->session->data['cielotransparente_TID'] . '</p>';
                }

                unset($this->session->data['cielotransparente_confirmacao']);
                unset($this->session->data['cielotransparente_LR']);
                unset($this->session->data['cielotransparente_TID']);
            }

            if ((isset($this->session->data['cieloAPI_confirmacao'])) && ($this->config->get('cielo_api_credito_status'))) {
                $this->load->type('tipocieloapi');

                if (($this->session->data['cieloAPI_confirmacao'] == Type_CieloApiStatus::Tp_AptoAFinalizar) || ($this->session->data['cieloAPI_confirmacao'] == Type_CieloApiStatus::Tp_Finalizado)) {
                    $this->data['OrderCielo_titulo'] = 'Seu pedido foi aprovado!';
                    $this->data['OrderCielo_mensagem'] = '<p>O pagamento foi aprovado pela operadora do cartão de crédito:</p><p> TID : ' . $this->session->data['cieloAPI_TID'] . '</p>';
                } else if ($this->session->data['cieloAPI_confirmacao'] == Type_CieloApiStatus::Tp_Aguardando) {
                    $this->data['OrderCielo_titulo'] = 'Seu pedido foi Pré Aprovado!';
                    $this->data['OrderCielo_mensagem'] = '<p>Já recebemos o seu pedido em nossa loja virtual, em breve enviaremos o link para o pagamento em seu email</p>';
                } else {
                    $this->data['OrderCielo_titulo'] = 'Seu pedido não foi aprovado!';
                    $this->data['OrderCielo_mensagem'] = '<p>O pagamento não foi aprovado pela operadora do cartão de crédito:</p><p> TID : ' . $this->session->data['cieloAPI_TID'] . '</p>';
                }

                unset($this->session->data['cieloAPI_confirmacao']);
                unset($this->session->data['cieloAPI_Retorno']);
                unset($this->session->data['cieloAPI_TID']);
            }


            if ((isset($this->session->data['rede_confirmacao'])) && ($this->config->get('rede_credito_status'))) {
                $this->load->model('payment/rede_credito');
                $this->load->type('tiporede');

                if ($this->session->data['rede_confirmacao'] == Type_RedeAutorizacao::Tp_RedeAutorizada) {
                    $this->data['OrderRede_titulo'] = 'Seu pedido foi aprovado!';
                    $this->data['OrderRede_mensagem'] = '<p>O pagamento foi aprovado pela operadora do cartão de crédito:</p><p>' . $this->session->data['rede_Retorno'] . ' - TID : ' . $this->session->data['rede_TID'] . '</p>';
                } elseif($this->session->data['rede_confirmacao'] == Type_RedeAutorizacao::Tp_RedeAutorizada) {
                    $this->data['OrderRede_titulo'] = 'Seu pedido não foi aprovado!';
                    $this->data['OrderRede_mensagem'] = '<p>O pagamento não foi aprovado pela operadora do cartão de crédito:</p><p>' . $this->session->data['rede_Retorno'] . ' - TID : ' . $this->session->data['rede_TID'] . '</p>';
                }
                elseif($this->session->data['rede_confirmacao'] == Type_RedeAutorizacao::Tp_Processando){
                    $this->data['OrderRede_titulo'] = 'Seu pedido está sendo processado!';
                    $this->data['OrderRede_mensagem'] = '<p>O pagamento está sendo processado pela operadora do cartão de crédito.</p><p></p>';
                }

                unset($this->session->data['rede_confirmacao']);
                unset($this->session->data['rede_Retorno']);
                unset($this->session->data['rede_TID']);
            }

            $this->data['checkout_success'] = true;

            //criado para trazer informações do tipo do modo de pagamento na tela de success
            $this->load->model('account/order');
            $order = $this->model_account_order->getOrder($this->session->data['payment_session']['order_id']);

            $payment_template = ($this->setPaymentTemplateSucess($order['payment_code'])) ? $this->getChild('payment/' . $order['payment_code'] . '/success') : false;

            if (isset($this->session->data['pixSessionData']) && !isset($this->session->data['orderPaymentCanceled']) && !$payment_template) {
                $this->data['text_payment_pix'] = 'Caso o pagamento não tenha sido realizado, basta acessar a página de pedidos';
            }
        }

        $this->data['payment_template'] = $payment_template ?? false;
        
        $this->language->load('checkout/success');

        //    $this->data['pixel_facebook_complete'] = html_entity_decode("<script> fbq('track', 'Purchase', {currency : 'BRL', value : '100.00'}); </script>", ENT_QUOTES, 'UTF-8');

        $this->data['breadcrumbs'] = array();

        $this->data['breadcrumbs'][] = array(
            'href' => $this->url->link('common/home', '', 'NONSSL', 'false'),
            'text' => $this->language->get('text_home'),
            'separator' => false
        );

        $this->data['breadcrumbs'][] = array(
            'href' => $this->url->link('checkout/cart'),
            'text' => $this->language->get('text_basket'),
            'separator' => $this->language->get('text_separator')
        );

        $this->data['breadcrumbs'][] = array(
            'href' => $this->url->link('checkout/checkout', '', 'SSL'),
            'text' => $this->language->get('text_checkout'),
            'separator' => $this->language->get('text_separator')
        );

        $this->data['breadcrumbs'][] = array(
            'href' => $this->url->link('checkout/success'),
            'text' => $this->language->get('text_success'),
            'separator' => $this->language->get('text_separator')
        );

        $this->breadcrumbs->setbreadcumbs($this->data['breadcrumbs']);

        $this->data['transaction'] = $transaction;
        $this->data['transactionItens'] = $transactionItens;
        $this->data['googleAnalytics'] = $google_analytics;


        if (isset($this->data['OrderCielo_mensagem'])) {
            $this->data['heading_title'] = $this->data['OrderCielo_titulo'];
            if ($this->customer->isLogged()) {
                $this->data['text_message'] = sprintf($this->data['OrderCielo_mensagem'] . $this->language->get('text_customer_cielo'), $this->url->link('account/account', '', 'SSL'), $this->url->link('account/order', '', 'SSL'), $this->url->link('information/contact'));
            } else {
                $this->data['text_message'] = sprintf($this->data['OrderCielo_mensagem'] . $this->language->get('text_guest_cielo'), $this->url->link('information/contact'));
            }
        } else if (isset($this->data['OrderRede_mensagem'])) {
            $this->data['heading_title'] = $this->data['OrderRede_titulo'];
            if ($this->customer->isLogged()) {
                $this->data['text_message'] = sprintf($this->data['OrderRede_mensagem'] . $this->language->get('text_customer_rede'), $this->url->link('account/account', '', 'SSL'), $this->url->link('account/order', '', 'SSL'), $this->url->link('information/contact'));
            } else {
                $this->data['text_message'] = sprintf($this->data['OrderRede_mensagem'] . $this->language->get('text_guest_rede'), $this->url->link('information/contact'));
            }
        } else if (isset($this->session->data['mensagem_payu'])) {
            $this->data['heading_title'] = $this->language->get('heading_title');
            if ($this->customer->isLogged()) {
                $this->data['text_message'] = sprintf($this->session->data['mensagem_payu'] . $this->language->get('text_customer_payu'), $this->url->link('account/account', '', 'SSL'), $this->url->link('account/order', '', 'SSL'), $this->url->link('information/contact'));
            } else {
                $this->data['text_message'] = sprintf($this->session->data['mensagem_payu'] . $this->language->get('text_guest_payu'), $this->url->link('information/contact'));
            }
            unset($this->session->data['mensagem_payu']);
        } else if (isset($this->session->data['orderPaymentCanceled'])) {

            $this->data['heading_title'] = $this->session->data['orderPaymentCanceled'];
            switch ($this->session->data['payment_session']['code_type']) {
                case Type_PaymentOption::Tp_CreditCard:
                    $this->data['text_message'] = 'Seu pedido foi cancelado porque ocorreu algum problema com o método de pagamento, mas não se preocupe, não será debitado nenhum valor em seu cartão de crédito.';
                    break;
                case Type_PaymentOption::Tp_Billet:
                    $this->data['text_message'] = 'Seu pedido foi cancelado porque ocorreu algum problema ao gerar o boleto.';
                    break;
                case Type_PaymentOption::Tp_BankTransfer:
                    $this->data['text_message'] = 'Seu pedido foi cancelado porque ocorreu algum problema ao gerar o link para transferência bancária.';
                    break;
              case Type_PaymentOption::Tp_Pix:
                $this->data['text_message'] = 'Seu pedido foi cancelado porque ocorreu algum problema ao gerar o link para pagamento Pix.';
                break;
            }

            unset($this->session->data['orderPaymentCanceled']);
        } else {
            $this->load->dmodel('layout_personalizado/custom_layout');
            $layout_success = $this->dmodel_layout_personalizado_custom_layout->getContents(Type_LayoutPersonalizado::Tp_LayoutSuccess);

            if (isset($layout_success[0]['descricao']) && isset($layout_success[0]['conteudo_layout'])) {

                $find = array();
                $replace = array();

                // passar exatamente os campos do find na ordem do replace, por causa do str_replace
                $find = array('{{ cli_nome }}', '{{ cli_email }}', '{{ loj_nome }}', '{{ ped_id }}', '{{ loj_link }}');
                $replace = array(
                    'cli_nome' => $this->customer->getFirstName() . ' ' . $this->customer->getLastName(),
                    'cli_email' => $this->customer->getEmail(),
                    'loj_nome' => $this->config->get('config_name'),
                    'ped_id'  => $this->session->data['payment_session']['order_id'],
                    'loj_link' => $this->urlloja->link('common/home', '', 'SSL')
                );

                $format = $layout_success[0]['conteudo_layout'];

                $mensagem = str_replace(array("\r\n", "\r", "\n"), '<br />', preg_replace(array("/\s\s+/", "/\r\r+/", "/\n\n+/"), '<br />', trim(str_replace($find, $replace, $format))));

                $this->data['heading_title']  = $layout_success[0]['descricao'];
                $this->data['text_message']   = $mensagem;
            } else {
                $this->data['heading_title'] = $this->language->get('heading_title');
                if ($this->customer->isLogged()) {
                    $this->data['text_message'] = $this->language->get('text_customer'); //sprintf($this->language->get('text_customer'), $this->url->link('account/account', '', 'SSL'), $this->url->link('account/order', '', 'SSL'), $this->url->link('information/contact'));
                } else {
                    $this->data['text_message'] = $this->language->get('text_customer'); //sprintf($this->language->get('text_guest'), $this->url->link('information/contact'));
                }
            }
        }

        $this->document->setTitle($this->data['heading_title']);

        $this->data['button_continue'] = $this->language->get('button_continue');

        $this->data['contact'] = $this->url->link('information/contact');
        $this->data['order'] = $this->url->link('account/order/info', 'order_id=' . $this->session->data['payment_session']['order_id']);
        $this->data['order_total'] = $order['total'];

        $this->data['continue'] = $this->url->link('common/home', '', 'NONSSL', 'false');

        $this->children = array(
            'common/breadcrumbs',
            'common/column_left',
            'common/column_right',
            'common/content_top',
            'common/content_bottom',
            'common/footer',
            'common/header'
        );

        $this->document->addScriptApp(array(
            'catalog/view/javascript/copyContent.js',
            'public/js/checkout/checkout.js'
        ));
        $this->data['scriptsApp'] = json_encode($this->document->getScriptsApp());

        $order_id = $this->session->data['payment_session']['order_id'] ?? 0;
       
        if (!$this->ftrgeralregistry->isApp()) {
            $this->loadDataSchedule($order_id);
        }

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

        $this->response->setOutput($this->render('checkout/success'));
    }


    public function setPaymentTemplateSucess($payment_code)
    {

        $paymentTamplate = [
            Type_YapayConfigs::Tp_NameModule     => $this->config->get('yapay_status'),
            Type_WirecardConfigs::Tp_NameModule  => $this->config->get('wirecard_status'),
            Type_GetnetConfigs::Tp_NameModule    => $this->config->get('getnet_status'),
            Type_PagseguroConfigs::Tp_NameModule => $this->config->get('pagseguro_api_status'),
            Type_pagarmeConfigs::Tp_NameModule   => $this->config->get('pagarme_status'),
            Type_materaConfigs::Tp_NameModule    => $this->config->get('matera_status'),
            Type_pixpdvConfigs::Tp_NameModule    => $this->config->get('pixpdv_status'),
            
            Type_PaymentsWithComments::Tp_Orcamento => $this->config->get('orcamento_status'),
            Type_PaymentsWithComments::Tp_BankTransfer => $this->config->get('bank_transfer_status'),
            Type_PaymentsWithComments::Tp_PagamentoDinamico => $this->config->get('pagamentodinamico_status'),
        ];

        //valida se o payment code existe da sessão possui templates de sucesso e valida também se o pagamento esta habilitado
        if (isset($payment_code) && in_array($payment_code, array_keys(array_filter($paymentTamplate)))) {
            return true;
        }

        return false;
    }


    public function getTransactionJs($order_id)
    {
        $this->load->model('account/order');
        $order = $this->model_account_order->getOrder($order_id);
        $order_total = $this->model_account_order->getOrderTotalsByCode($order_id, 'shipping');

        $transaction = array();

        $transaction = array(
            'id' => $order_id,
            'affiliation' => $this->config->get('config_owner'),
            'revenue' => $order['total'],
            'shipping' => $order_total['value'],
            'tax' => $this->cart->getTaxesST(),
            'currency' => $this->session->data['currency']
        );

        return $transaction;
    }

    public function getTransactionItensJs($order_id)
    {

        $transactionItens = array();
        $this->load->model('catalog/category');
        $this->load->dmodel('account/order');

        $orderProducts = $this->dmodel_account_order->getOrderProducts($order_id);

        foreach ($orderProducts as $orderProduct) {
            $transactionItens[] = array(
                'id' => $order_id,
                'name' => $orderProduct['name'],
                'sku' => $orderProduct['sku'],
                'category' => $this->model_catalog_category->getCategoriesByProductId($orderProduct['product_id']),
                'price' => $orderProduct['price'],
                'quantity' => $orderProduct['quantity'],
                'currency' => $this->session->data['currency']
            );
        }

        return $transactionItens;
    }

    public function verifyPaymentPix()
    {
        $orderID = $this->session->data['payment_session']['order_id'];
        $code = $this->session->data['payment_session']['code'];
        $pixModules = [
            Type_getnetConfigs::Tp_NameModule,
            Type_pagarmeConfigs::Tp_NameModule, 
            Type_materaConfigs::Tp_NameModule,
            Type_pixpdvConfigs::Tp_NameModule,
        ];

        if (isset($code) && (array_search($code, $pixModules) !== false)) {
            $this->load->model("payment/$code");

            $this->session->data['order_id'] = $orderID;
            $order_info = $this->getOrder($orderID, $code, $pixModules);
            if ($code == Type_pixpdvConfigs::Tp_NameModule) {
                $this->getStatusQrCodePix($order_info['qrcode_id'], $orderID);
            }

            if ($order_info){
                $this->response->setOutputjson($this->{"model_payment_$code"}->getStatusPayment($order_info['order_status_id']));
            }
        }
    }

    private function getOrder($orderID, $code, $pixModules)
    {
        $this->load->dmodel('checkout/order');
        $orderInfo = $this->dmodel_checkout_order->getOrder($orderID);
        
        $pendingStatus = $this->config->get("{$code}_order_status_pending");
        $openStatus = $this->config->get("{$code}_order_status_open");
    
        // Caso tenha mais status ou modulos alterar comportamento para busca em array
        $typesPix = [
            Type_materaConfigs::Tp_NameModule,
            Type_pixpdvConfigs::Tp_NameModule,
        ];
        $status = in_array($code, $typesPix) ? $openStatus : $pendingStatus;
    
        $this->dmodel_checkout_order->confirm($orderID, $status, '');
    
        return $orderInfo;
    }

    private function getStatusQrCodePix($qrCodePix = null, $orderID = null)
    {
        if (!is_null($qrCodePix)) {
            $this->load->controller('payment/pixpdv');
            $controllerPaymentPixPdv = new ControllerPaymentPixPdv($this->registry);
            $result = $controllerPaymentPixPdv->getQRCodeStatus($qrCodePix, $orderID);
        }

    }

    public function loadDataSchedule($order_id) {
        $this->load->model('checkout/schedule');

        $this->data['data']['configurations'] = [
            'is_futura' => $this->model_checkout_schedule->getScheduleFromFuturaParameters(),
            'order_id' => $order_id,
            'has_order_scheduled' => $this->model_checkout_schedule->hasScheduledOrder($order_id),
        ];

        $this->data['schedule_template'] = $this->render('success/schedule'); 
    }
}
