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

class ControllerPaymentCieloapiCredito extends ControllerPaymentGeralConfigs
{
    private $error = array();

    public function index()
    {
        parent::index();

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

        $this->document->setTitle($this->language->get('heading_title'));

        $this->document->addScript(array(
            'public/js/payment/cielo_api_credito.js'
        ));

        $this->load->type('tipocieloapi');
        $this->data['Type_CieloApiTipoFinalizacao'] = $this->load->typeForTwig('Type_CieloApiTipoFinalizacao');
        $this->data['Type_DisplayModuleOption'] = $this->load->typeForTwig('Type_DisplayModuleOption');
        $this->data['Type_AntiFraudeCheckout'] = $this->load->typeForTwig('Type_AntiFraudeCheckout');
        $this->data['Type_CieloAntiFraudeAnaliseFluxo'] = $this->load->typeForTwig('Type_CieloAntiFraudeAnaliseFluxo');
        $this->data['Type_CieloAntiFraudeAnaliseCriterio'] = $this->load->typeForTwig('Type_CieloAntiFraudeAnaliseCriterio');
        $this->data['exclude_type_config_parcelamento'] = array(Type_ConfigParcelamento::PorBandeira);
        $this->data['credit_cards'] = ftr_geral::getArrayTypes(Type_CieloApiBandeira::getEnumList(), null, null);

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

        $this->data['breadcrumbs'][] = array(
            'text' => $this->language->get('text_payment'),
            'separator' => " :: ",
            'href' => $this->url->linkAnchor('extension/module', 'token=' . $this->session->data['token'], 'tab-info=' . $this->request->get['type'], 'SSL'),
        );

        $this->data['breadcrumbs'][] = array(
            'text' => $this->language->get('heading_title'),
            'separator' => " :: ",
            'href' => $this->url->link('payment/cielo_api_credito', 'token=' . $this->session->data['token'] . '&type=' . $this->request->get['type'], 'SSL')
        );

        $this->data['cancel'] = $this->url->linkAnchor('extension/module', 'token=' . $this->session->data['token'], 'tab-info=' . $this->request->get['type'], 'SSL');
        $this->data['url_validate_merchant'] = $this->url->link('payment/cielo_api_credito/validateMerchant', 'token=' . $this->session->data['token'], 'SSL');
        $this->data['url_parcelamento_config'] = $this->url->link('payment/cielo_api_credito/getParcelamentoAvancado', 'token=' . $this->session->data['token'], 'SSL');
        $this->data['url_save'] = $this->url->link('payment/cielo_api_credito/save', 'token=' . $this->session->data['token'], 'SSL');
        $this->data['url_redirect_success'] = $this->url->linkAnchor('extension/module', 'token=' . $this->session->data['token'], 'tab-info=' . $this->request->get['type'], 'SSL');

        $config_data = array(
            'cielo_api_descricao',
            'cielo_api_tipo_finalizacao',
            'cielo_api_numero',
            'cielo_api_chave',
            'cielo_api_parcela_semjuros',
            'cielo_api_parcela_juros',
            'cielo_api_parcela_comdesconto',
            'cielo_api_parcela_desconto',
            'cielo_api_parcela_minimo',
            'cielo_api_parcela_qtdmax',
            'cielo_api_order_status_id',
            'cielo_api_order_status_posterior_id',
            'cielo_api_order_status_posteriorlink_id',
            'cielo_api_anti_fraude',
            'cielo_api_order_pg_id',
            'cielo_api_order_pe_id',
            'cielo_api_order_ne_id',
            'cielo_api_order_au_id',
            'cielo_api_order_status_cancelado_id',
            'cielo_api_total',
            'cielo_api_ambiente_teste',
            'cielo_api_display',
            'cielo_api_credito_status',
            'cielo_api_sort_order',
            'cielo_api_anti_fraude_sequence',
            'cielo_api_anti_fraude_sequence_criteria',
            'cielo_api_anti_fraude_capturelowrisk',
            'cielo_api_anti_fraude_voidhightrisk',
            'cielo_api_credito_cnpj',
            'cielo_api_credit_card',
            'cielo_api_config_parcelamento'
        );

        foreach ($config_data as $conf) {
            if (isset($this->request->post[$conf])) {
                $this->data[$conf] = $this->request->post[$conf];
            } else {
                $this->data[$conf] = $this->config->get($conf);
            }
        }

        $this->load->model('localisation/order_status');
        $this->data['order_statuses'] = $this->model_localisation_order_status->getOrderStatuses();
        if (isset($this->request->post['cielo_api_geo_zone_id'])) {
            $this->data['cielo_api_geo_zone_id'] = $this->request->post['cielo_api_geo_zone_id'];
        } else {
            $this->data['cielo_api_geo_zone_id'] = $this->config->get('cielo_api_geo_zone_id');
        }

        $this->load->model('localisation/geo_zone');
        $this->data['geo_zones'] = $this->model_localisation_geo_zone->getGeoZones();
        if (isset($this->request->post['cielo_api_client_teste'])) {
            $this->data['cielo_api_client_teste'] = $this->request->post['cielo_api_client_teste'];
        } else {
            $this->data['cielo_api_client_teste'] = $this->config->get('cielo_api_client_teste');
        }


        $this->children = array(
            "common/header",
            "common/footer"
        );
        $this->response->setOutput($this->render('payment/cielo_api_credito'));

    }

    public function save()
    {
        $response = array();

        if (!$this->user->hasPermission('modify', 'payment/cielo_api_credito')) {
            $response['errors']['warning'] = 'Acesso negado!';
            return $this->response->setOutputJson($response);
        }

        if (count($this->validate()) == 0) {
            $this->load->model('setting/setting');

            $credtcards = array();
            $this->removeMask(Type_CreditCardModule::getNickFromConstValue(Type_CreditCardModule::Cielo));

            foreach ($this->request->post['cielo_api_credit_card'] as $key => $credtcard) {
                $credtcards[$key]['valor_minimo'] = 0; /* O checkout padrão dos cartões possui valor minimo por bandeira, como módulo não tem essa config, ele é setado em 0 */
                $credtcards[$key]['descricao'] = $credtcard['descricao'];
            }
            $this->request->post['cielo_api_credit_card'] = $credtcards;
            $arrayJson = array('cielo_api_parcelamento_configs', 'cielo_api_credit_card');
            $this->model_setting_setting->editSetting('cielo_api_credito', $this->request->post, 0, $arrayJson);

            $this->session->data['success'] = $this->language->get('text_success');
            $response['success'] = $this->language->get('text_success');
        } else {
            $response['errors'] = $this->validate();
        }

        $this->response->setOutputJson($response);
    }

    public function removeMask($module)
    {
        if(isset($this->request->post['cielo_api_parcela_minimo']) and ($this->request->post['cielo_api_parcela_minimo'])){
            $this->request->post['cielo_api_parcela_minimo'] = ftr_geral::removeMaskToDouble($this->request->post['cielo_api_parcela_minimo']);
        }

        if(isset($this->request->post['cielo_api_total']) and ($this->request->post['cielo_api_total'])){
            $this->request->post['cielo_api_total'] = ftr_geral::removeMaskToDouble($this->request->post['cielo_api_total']);
        }

        parent::removeMask($module);
    }

    public function validate()
    {
        $this->load->type('tipocieloapi');
        $this->load->type('tipocomum');
        $this->load->language('payment/cielo_api_credito');


        if (!$this->user->hasPermission('modify', 'payment/cielo_api_credito')) {
            $this->error['warning'] = $this->language->get('error_permission');
        }

        if (isset($this->request->post['cielo_api_anti_fraude_sequence']) && ($this->request->post['cielo_api_anti_fraude_sequence'] == Type_CieloAntiFraudeAnaliseFluxo::Tp_AnalyseFirst)) {
            if ($this->request->post['cielo_api_anti_fraude_capturelowrisk'] == Type_Status::Tp_Habilitado) {
                $this->error['cielo_api_anti_fraude_capturelowrisk'] = $this->language->get('err_exige_api_anti_fraude_sequence');
            }
            if ($this->request->post['cielo_api_anti_fraude_voidhightrisk'] == Type_Status::Tp_Habilitado) {
                $this->error['cielo_api_anti_fraude_voidhightrisk'] = $this->language->get('err_exige_api_anti_fraude_sequence');
            }
            if ($this->request->post['cielo_api_anti_fraude_sequence_criteria'] == Type_CieloAntiFraudeAnaliseCriterio::Tp_OnSuccess) {
                $this->error['cielo_api_anti_fraude_sequence_criteria'] = $this->language->get('err_exige_api_anti_fraude_sequence');
            }
        }

        if (trim($this->request->post['cielo_api_numero']) == '') {
            $this->error['cielo_api_numero'] = $this->language->get('err_cielo_api_numero');
        }

        if (trim($this->request->post['cielo_api_chave']) == '') {
            $this->error['cielo_api_chave'] = $this->language->get('err_cielo_api_chave');
        }

        if (trim($this->request->post['cielo_api_parcela_semjuros']) == '') {
            $this->request->post['cielo_api_parcela_semjuros'] = 0;
        }

        if (trim($this->request->post['cielo_api_parcela_juros']) == '') {
            $this->request->post['cielo_api_parcela_juros'] = 0;
        }

        if (trim($this->request->post['cielo_api_parcela_comdesconto']) == '') {
            $this->request->post['cielo_api_parcela_comdesconto'] = 0;
        }

        if (trim($this->request->post['cielo_api_parcela_desconto']) == '') {
            $this->request->post['cielo_api_parcela_desconto'] = 0;
        }

        if (trim($this->request->post['cielo_api_parcela_minimo']) == '') {
            $this->request->post['cielo_api_parcela_minimo'] = 0;
        }

        if (trim($this->request->post['cielo_api_parcela_qtdmax']) == '') {
            $this->request->post['cielo_api_parcela_qtdmax'] = 0;
        }

        if (trim($this->request->post['cielo_api_total']) == '') {
            $this->request->post['cielo_api_total'] = 0;
        }

        if (((float)$this->request->post['cielo_api_total'] > 0 ) && ((float)$this->request->post['cielo_api_parcela_minimo'] > (float)$this->request->post['cielo_api_total'])) {
            $this->error['cielo_api_parcela_minimo'] = sprintf($this->language->get('err_cielo_api_parcela_minimo_api_total'), $this->request->post['cielo_api_total']);
        }

        if ($this->request->post['cielo_api_config_parcelamento'] == Type_ConfigParcelamento::Padrao) {
            if ($this->request->post['cielo_api_parcela_comdesconto'] > 0 && $this->request->post['cielo_api_parcela_desconto'] == 0) {
                $this->error['cielo_api_parcela_desconto'] = $this->language->get('err_cielo_api_desconto');
            } else if ($this->request->post['cielo_api_parcela_comdesconto'] == 0 && $this->request->post['cielo_api_parcela_desconto'] > 0) {
                $this->error['cielo_api_parcela_comdesconto'] = $this->language->get('err_cielo_api_desconto');
            }
        }

        if (($this->request->post['cielo_api_config_parcelamento'] == Type_ConfigParcelamento::Padrao) && $this->request->post['cielo_api_parcela_juros'] == 0 &&
            ($this->request->post['cielo_api_parcela_qtdmax'] != ($this->request->post['cielo_api_parcela_semjuros'] + $this->request->post['cielo_api_parcela_comdesconto']))
        ) {
            $this->error['cielo_api_parcela_qtdmax'] = $this->language->get('err_cielo_api_parcela_maxima_total');
        }

        $errorParcelamento = parent::parcelamentoValidate('cielo_api');

        $this->error = array_merge($this->error, $errorParcelamento);

        $errorBandeira = true;
        foreach ($this->request->post['cielo_api_credit_card'] as $value) {
            if (isset($value['descricao'])) {
                $errorBandeira = false;
                break;
            }
        }

        if ($errorBandeira) {
            $this->error['warning'] = $this->language->get('err_cielo_api_bandeira');
            $this->error['cielo_api_bandeira'] = $this->language->get('err_cielo_api_bandeira');
        }

        switch ($this->request->post['cielo_api_anti_fraude']) {
            case Type_AntiFraudeCheckout::Tp_ClearSaleStartManual:
                if (!$this->config->get('clearsale_status')) {
                    $this->error['cielo_api_anti_fraude'] = $this->language->get('err_cielo_api_anti_fraude');
                }
                break;
        }

        if (count($this->error) > 0) {
            $this->error['warning'] = $this->language->get('error_warning');
        }

        return $this->error;
    }

    public function validateMerchant()
    {

        //Essa funcao de teste de MerchantID e MerchantKey nao existe na API porem fizemos uma pequena gambis
        //para poder retornar se o ID e a Key é valida ou nao. Usamos uma funcao de consulta de
        //PaymentID, o correto eh retornar 404 quando nao encontrar o ID, isso significa que conectou com o MerchantID e a
        //MerchantKey mas nao encontrou o PaymentID procurado, porem se retornar 400 ou 401 significa que nao conseguiu
        //atenticar com a Merchant ID e Key.

        //400 - Formato da merchant ID ou Key incorreto
        //401 - Nao autorizado com o merchant ID ou Key

        $this->load->language('payment/cielo_api_credito');

        if (isset($this->request->get['cielo_api_numero'])) {
            $cielo_api_numero = $this->request->get['cielo_api_numero'];
        } else {
            $cielo_api_numero = '';
        }

        if (isset($this->request->get['cielo_api_chave'])) {
            $cielo_api_chave = $this->request->get['cielo_api_chave'];
        } else {
            $cielo_api_chave = '';
        }

        $errorMessage = '';

        try {
            $result = $this->cieloapi->cieloValidaMerchant($cielo_api_numero, $cielo_api_chave);
        } catch (Exception $e) {
            switch ($e->getCode()) {

                case 404 :
                    $result = true;
                    break;

                case 400:
                case 401:
                    $result = false;
                    break;

                default:
                    $result = false;
                    break;
            }

            if (!$result && $e->getCieloError()){
                $errorMessage = "<br> <br> Erro: " . $e->getCieloError()->getMessage();
            }
        }

        $this->response->setOutputJson([
            'type' => $result ? 'success' : 'error',
            'message' => $result ? $this->language->get('success_validate_merchant') : $this->language->get('error_validate_merchant') . $errorMessage
        ]);
    }

    public function getParcelamentoAvancado()
    {
        parent::getParcelamentoAvancado();
    }

    public function install()
    {
        $this->load->model('setting/setting');
        $this->model_setting_setting->insertSettingValue('cielo_api_credito', 'cielo_api_credito_cnpj', '01.027.058/0001-91');
    }


}

?>
