<?php

require_once "../movingPay/MPTransacao.php";
require_once "../controllers/MovimentacoesCtl.php";
require_once "../controllers/MovimentacoesVeiculosCtl.php";
require_once "../controllers/ClienteCtl.php";
require_once "../controllers/ClientePlanosBandeiraCtl.php";
require_once "../controllers/PlanoBoletoCtl.php";
require_once "../controllers/PlanoPixCtl.php";
require_once "../controllers/PlanoVeiculoCtl.php";

include_once "gerarToken.php";

if( $_SERVER['REQUEST_METHOD'] !== "POST" ){
    $retorno = array("status" => false, "motivoCritica" => 'Somente permitido método POST!');
    echo json_encode($retorno,  JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    exit();
}

$header = null;
foreach (getallheaders() as $name => $value) {
    $header[strtolower($name)]= $value;
}

if (empty($header['adgtoken']) || is_null($header['adgtoken'])){
    $retorno = array("status" => false, "motivoCritica" => 'Segurança: informação vazia.');
    echo json_encode($retorno,  JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    exit();
}

$jwt = $header['adgtoken'];

$json = file_get_contents('php://input');
if (empty($json) || is_null($json)){
    $retorno = array("status" => false, "motivoCritica" => 'Requisição Vazia!');
    echo json_encode($retorno,  JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    exit();
}

//efeuta o teste do Token

if (abreToken($jwt, '#@2022Adg$#CDX') != "OK") {
    $retorno = array("status" => false, "motivoCritica" => 'Token Inválido');
    echo json_encode($retorno, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    exit();
}

$resultado = json_decode($json);

$retorno = "";

if (!empty($resultado)) {

    $origem = "POS";
    if(isset($resultado->origem)){
        $origem = $resultado->origem;
    }

    $tabelaUtilizada = "";
    if(isset($resultado->tabelaUtilizada)){
        $tabelaUtilizada = $resultado->tabelaUtilizada;
    }

    $servico = $resultado->servico;
    $ec = $resultado->ec;
    $documento = $resultado->documento;
    $documentoAdquirente = $resultado->documentoAdquirente;
    $referenciaExterna = $resultado->referenciaExterna;
    $situacao = $resultado->situacao;
    $refuse_reason = $resultado->refuse_reason;
    $codigoRetorno = $resultado->codigoRetorno;

    $codigoAdquirente = $resultado->codigoAdquirente;
    $codigoMCC = $resultado->codigoMCC;
    
    if(isset($resultado->mcc)){
        $codigoMCC = $resultado->mcc;
    }

    $codCliMovingPay = null;
    if(isset($resultado->IdMovingPay)){
        $codCliMovingPay = $resultado->IdMovingPay;
    }

    $softDescriptor = $resultado->softDescriptor;
    $autorizacao = $resultado->autorizacao;
    $cvNumber = $resultado->cvNumber;
    $moeda = $resultado->moeda;
    $tefNsu = $resultado->tefNsu;
    $nsu = $resultado->nsu;
    $valor = $resultado->valor;
    $valorOriginal = $resultado->valorOriginal;
    if($resultado->parcelas == 0 || $resultado->parcelas == "0"){
        $parcelas = 1;
    }else{
        $parcelas = $resultado->parcelas;
    }

    if($origem == "TOTEM" ){
        $valor = $valor / $parcelas;
    }

    $cartao_portador = $resultado->cartao_portador;
    $cartao_primeiros_digitos = $resultado->cartao_primeiros_digitos;
    $cartao_ultimos_digitos = $resultado->cartao_ultimos_digitos;

    //utilizado para corrigir o retorno vindo da Auttar
    if(strlen($cartao_primeiros_digitos) > 10){
        $cartao_primeiros_digitos = substr($resultado->cartao_primeiros_digitos,0,6);
        $cartao_ultimos_digitos = preg_replace('/[^0-9]/', '', substr($resultado->cartao_primeiros_digitos,11));
    }

    $bandeira = trim(strtoupper($resultado->bandeira));

    $forma_pagamento = trim(strtoupper($resultado->forma_pagamento));
    if(empty($forma_pagamento) || $forma_pagamento == ""){
        if($parcelas == 1){
            if($tabelaUtilizada == ""){
                $forma_pagamento = "CHCK";
            }else{
                $forma_pagamento = "CRDT";
            }

        }else{
            $forma_pagamento = "CRDT_PARC";
            if($tabelaUtilizada == "CLIENTE"){
                $forma_pagamento = "CRDT_PARC";
            }
        }
    }

    $forma_captura = strtoupper($resultado->forma_captura);
    $numero_serie = $resultado->numero_serie;
    //$data_inicial_transacao = date('Y-m-d\TH:m:i\Z');
    $data_inicial_transacao = date('Y-m-d H:i:s');

    $emiteNota = $resultado->emiteNota;
    $novosDados = $resultado->novosDados;
    //if($novosDados == true){
        $notaNome = $resultado->notaNome;
        $notaTelefone = $resultado->notaTelefone;
        $notaEmail = $resultado->notaEmail;
        $notaDocumento = $resultado->notaDocumento;
        $notaCep = $resultado->notaCep;
        $notaRua = $resultado->notaRua;
        $notaNumero = $resultado->notaNumero;
        $notaComplemento = $resultado->notaComplemento;
        $notaBairro = $resultado->notaBairro;
        $notaCidade = $resultado->notaCidade;
        $notaEstado = $resultado->notaEstado;
    //}

    $retornoJson = $resultado->retornoJson;

    $calcCliente = 0;
    $calcAdquirente = 0;
    $calcCdx = 0;
    $calcPolo = 0;
    $calcRepresentante = 0;
    $dataRepasse = null;

    $bandeiraPesquisa = $bandeira;
    switch (trim($bandeira)) {
        case "Master Maestro":
        case "MASTER":
        case "MAESTRO":
        case "Maestro":
            $bandeiraPesquisa = "MASTERCARD";
            break;
        case "ELECTRON":
        case "Visa Debito":
        case "Visa Credito":
        case "Visa Electron":
        case "VISA ELECTRON":
        case "VISA DEBITO":
        case "VISA CREDITO":
            $bandeiraPesquisa = "VISA";
            $bandeira = "VISA";
            break;
        case "HIPER":
        case "Hiper Credito":
        case "HIPER CREDITO":
            $bandeiraPesquisa = "HIPERCARD";
            $bandeira = "HIPERCARD";
            break;
        case "ELO DEBITO":
        case "ELO Credito":
        case "ELO Debito":
        case "ELO CREDITO":
            $bandeiraPesquisa = "ELO";
            $bandeira = "ELO";
            break;
        case "AMERICAN EXPRESS":
        case "Amex Credito":
        case "AMEX CREDITO":
            $bandeiraPesquisa = "AMEX";
            $bandeira = "AMEX";
            break;
    }


    $cod_cliente = 0;
    $Cliente = new ClienteCtl();
    if(!empty($codCliMovingPay) && $codCliMovingPay > 0){
        $Cliente->setCliCpfCnpj($codCliMovingPay);
        $resCli = $Cliente->getClientePorCpfTodos();
        if($resCli->rowCount() <= 0){
            $Cliente->setCliCpfCnpj($documento);
            $resCli = $Cliente->getClientePorCpfTodos();
        }else{
            $documento = $codCliMovingPay;
        }
    }else{
        $Cliente->setCliCpfCnpj($documento);
        $resCli = $Cliente->getClientePorCpfTodos();
    }

    if($resCli->rowCount() > 0){
        $itemCliente = $resCli->fetch(PDO::FETCH_OBJ);
        $cod_cliente = $itemCliente->cli_id;

        if(empty($codCliMovingPay) || $codCliMovingPay == null ) {
            if (isset($itemCliente->cli_codmovingpay) && !empty($itemCliente->cli_codmovingpay)) {
                $codCliMovingPay = $itemCliente->cli_codmovingpay;
            }
        }

        if($origem == "POS" && $situacao == "APPR") {
            if(strtoupper($servico) == "VENDAS" || strtoupper($servico) == "VENDASEDI" || $servico == "VendasSoftwareExpress") {
                $ClientePlanos = new ClientePlanosBandeiraCtl();
                $ClientePlanos->setClienteId($itemCliente->cli_id);
                $ClientePlanos->setBandeira(trim($bandeiraPesquisa));
                $ClientePlanos->setParcela(trim($parcelas));
                if ($forma_pagamento == "CHCK") {
                    $ClientePlanos->setTipo("DEBITO");
                } else {
                    if ($forma_pagamento == "PIX") {
                        $ClientePlanos->setTipo("PIX");
                        $ClientePlanos->setBandeira("VISA");
                    } else {
                        $ClientePlanos->setTipo("CREDITO");
                    }
                }

                $resPlano = $ClientePlanos->getClientePlanosPorCliIdBandParcelaTipo();
                if ($resPlano->rowCount() > 0) {
                    $calcPolo = 0.00;
                    $calcRepresentante = 0.00;

                    $itemPlano = $resPlano->fetch(PDO::FETCH_OBJ);

                    $total = intval($parcelas) * (intval($valor) / 100);

                    if($tabelaUtilizada == "CLIENTE"){
                        $calcCliente = floatval($valorOriginal);
                        $calcAdquirente = $total - floatval($valorOriginal);
                    }else{
                        $calcCliente = $total - ($total * (floatval($itemPlano->adquirente) / 100));
                        $calcAdquirente = ($total * (floatval($itemPlano->adquirente) / 100));
                    }


                    if (floatval($itemPlano->polo) > 0) {
                        //$spread = $total * ($itemPlano->spread / 100);
                        $calcPolo = $total * ($itemPlano->polo / 100);
                    }

                    if (floatval($itemPlano->representante) > 0) {
                        $calcRepresentante = $calcAdquirente * ($itemPlano->representante / 100);
                    }

                    $calcCdx = $calcAdquirente - $calcPolo - $calcRepresentante;

                    try {
                        if($itemCliente->cli_diaspagamento > 0){
                            $date = new DateTime('+' . $itemCliente->cli_diaspagamento . ' day');
                        }else{
                            $date = new DateTime('+' . $itemPlano->dias_pagamento . ' day');
                        }

                        $dataRepasse = $date->format('Y-m-d');

                        if(strtoupper($servico) == "VENDASEDI" || $servico == "VendasSoftwareExpress"){
                            $dataBase = $resultado->data_inicial_transacao;
                            if($itemCliente->cli_diaspagamento > 0){
                                $dataRepasse = date('Y-m-d', strtotime("+".$itemCliente->cli_diaspagamento ." days",strtotime($dataBase)));
                            }else{
                                $dataRepasse = date('Y-m-d', strtotime("+2 days",strtotime($dataBase)));
                            }

                        }


                    } catch (Exception $e) {

                    }


                }
            }

            if($servico == "Debito Veicular") {
                $PlanoDeb = new PlanoVeiculoCtl();
                $PlanoDeb->setApiId(1);
                $PlanoDeb->setParceiroId(3);
                $PlanoDeb->setInstallment($parcelas);
                $resPlanoDeb = $PlanoDeb->getListaAtivosPorEstadoParceiroParcela();

                if($resPlanoDeb->rowCount() > 0){
                    $itemPlano = $resPlanoDeb->fetch(PDO::FETCH_OBJ);

                    $total = intval($parcelas) * (intval($valor) / 100);
                    $calcCliente = ($total * ($itemPlano->rebate_cliente / 100));
                    $calcAdquirente = ($total * (floatval($itemPlano->coefficient))) - $total;

                    if (floatval($itemPlano->rebate_polo) > 0) {
                        $calcPolo = $total * ($itemPlano->rebate_polo / 100);
                    }

                    if (floatval($itemPlano->rebate_representante) > 0) {
                        $calcRepresentante = $calcAdquirente * ($itemPlano->rebate_representante / 100);
                    }

                    try {
                        $date = new DateTime('+' . 2 . ' day');
                        $dataRepasse = $date->format('Y-m-d');
                    } catch (Exception $e) {

                    }
                }

            }

            if($servico == "PIX Parcelado") {
                $PlanoPix = new PlanoPixCtl();
                $PlanoPix->setParceiroId(12);
                $PlanoPix->setInstallment($parcelas);
                $resPlanoPix = $PlanoPix->getListaAtivosPorParceiroParcela();

                if($resPlanoPix->rowCount() > 0){
                    $itemPlano = $resPlanoPix->fetch(PDO::FETCH_OBJ);

                    $total = intval($parcelas) * (intval($valor) / 100);
                    $calcCliente = ($total * ($itemPlano->rebate_cliente / 100));
                    //$calcAdquirente = ($total * (floatval($itemPlano->coefficient))) - $total;
                    $calcAdquirente = $total - floatval($valorOriginal);

                    if (floatval($itemPlano->rebate_polo) > 0) {
                        $calcPolo = $total * ($itemPlano->rebate_polo / 100);
                    }

                    if (floatval($itemPlano->rebate_representante) > 0) {
                        $calcRepresentante = $calcAdquirente * ($itemPlano->rebate_representante / 100);
                    }

                    try {
                        $date = new DateTime('+' . 2 . ' day');
                        $dataRepasse = $date->format('Y-m-d');
                    } catch (Exception $e) {

                    }
                }

            }

            if($servico == "Crédito PIX") {
                $PlanoPix = new PlanoPixCtl();
                $PlanoPix->setParceiroId(6);
                $PlanoPix->setInstallment($parcelas);
                $resPlanoPix = $PlanoPix->getListaAtivosPorParceiroParcela();

                if($resPlanoPix->rowCount() > 0){
                    $itemPlano = $resPlanoPix->fetch(PDO::FETCH_OBJ);

                    $total = intval($parcelas) * (intval($valor) / 100);
                    $calcCliente = ($total * ($itemPlano->rebate_cliente / 100));
                    //$calcAdquirente = ($total * (floatval($itemPlano->coefficient))) - $total;
                    $calcAdquirente = $total - floatval($valorOriginal);

                    if (floatval($itemPlano->rebate_polo) > 0) {
                        $calcPolo = $total * ($itemPlano->rebate_polo / 100);
                    }

                    if (floatval($itemPlano->rebate_representante) > 0) {
                        $calcRepresentante = $calcAdquirente * ($itemPlano->rebate_representante / 100);
                    }

                    try {
                        $date = new DateTime('+' . 2 . ' day');
                        $dataRepasse = $date->format('Y-m-d');
                    } catch (Exception $e) {

                    }
                }

            }

            if($servico == "Boleto Parcelado") {
                $PlanoBoleto = new PlanoBoletoCtl();
                $PlanoBoleto->setParceiroId(3);
                $PlanoBoleto->setInstallment($parcelas);
                $resPlanoBol = $PlanoBoleto->getListaAtivosPorParceiroParcela();

                if($resPlanoBol->rowCount() > 0){
                    $itemPlano = $resPlanoBol->fetch(PDO::FETCH_OBJ);

                    $total = intval($parcelas) * (intval($valor) / 100);
                    $calcCliente = ($total * ($itemPlano->rebate_cliente / 100));

                    if (floatval($itemPlano->rebate_polo) > 0) {
                        $calcPolo = $total * ($itemPlano->rebate_polo / 100);
                    }

                    if (floatval($itemPlano->rebate_representante) > 0) {
                        $calcRepresentante = $calcAdquirente * ($itemPlano->rebate_representante / 100);
                    }

                    try {
                        $date = new DateTime('+' . 2 . ' day');
                        $dataRepasse = $date->format('Y-m-d');
                    } catch (Exception $e) {

                    }
                }

            }

        }

    }

    if(isset($documento)){
        $Movimento = new MovimentacoesCtl();

        if($servico == "Estorno"){
            //guardo o transacao original
            $Movimento->setReferenciaExterna($referenciaExterna);
            $itemEstorno = $Movimento->getMovimentacoesPorRefExterna()->fetch(PDO::FETCH_OBJ);
        }


        $Movimento->setCliId($cod_cliente);
        $Movimento->setOrigem($origem);
        $Movimento->setServico($servico);
        $Movimento->setNumeroEc($ec);
        $Movimento->setDocumento($documento);
        $Movimento->setReferenciaExterna($referenciaExterna);
        $Movimento->setSituacao($situacao);
        $Movimento->setRecusaDescricao($refuse_reason);
        $Movimento->setCodigoRetorno($codigoRetorno);
        $Movimento->setCodigoAdquirente($codigoAdquirente);
        $Movimento->setCodigoMcc($codigoMCC);
        $Movimento->setSoftDescriptor($softDescriptor);
        $Movimento->setAutorizacao($autorizacao);
        $Movimento->setNumeroCv($cvNumber);
        $Movimento->setMoeda($moeda);
        $Movimento->setNsuTef($tefNsu);
        $Movimento->setNsu($nsu);
        $Movimento->setValor(intval($valor)/100);
        if($servico == "Estorno"){
            $Movimento->setValorOriginal(intval($valorOriginal)/100);
        }else{
            $Movimento->setValorOriginal(floatval($valorOriginal));
        }

        if($origem != "POS" && $origem != "WEB" && $origem != "TOTEM" ){
            $Movimento->setValorOriginal(intval($valorOriginal)/100);
        }

        $Movimento->setParcelas($parcelas);
        $Movimento->setCartaoPortador($cartao_portador);
        $Movimento->setCartaoDigIni($cartao_primeiros_digitos);
        $Movimento->setCartaoDigFim($cartao_ultimos_digitos);
        $Movimento->setBanderia($bandeira);
        $Movimento->setFormaPagamento($forma_pagamento);
        $Movimento->setFormaCaptura($forma_captura);
        $Movimento->setNumeroSerie($numero_serie);
        $Movimento->setData($data_inicial_transacao);

        $Movimento->setEmiteNota((int)$emiteNota);
        $Movimento->setNovosDados((int)$novosDados);
        $Movimento->setNotaNome($notaNome);
        $Movimento->setNotaTelefone($notaTelefone);
        $Movimento->setNotaEmail($notaEmail);
        $Movimento->setNotaDocumento($notaDocumento);
        $Movimento->setNotaCep($notaCep);
        $Movimento->setNotaRua($notaRua);
        $Movimento->setNotaNumero($notaNumero);
        $Movimento->setNotaComplemento($notaComplemento);
        $Movimento->setNotaBairro($notaBairro);
        $Movimento->setNotaCidade($notaCidade);
        $Movimento->setNotaEstado($notaEstado);
        $Movimento->setUrlNotification($resultado->urlNotification);
        $Movimento->setRetornoJson($retornoJson);
        $Movimento->setTabelaUtilizada($tabelaUtilizada);

        //if($servico == "Debito Veicular" || $servico == "PIX Parcelado" || $servico == "Boleto Parcelado"){
        //    $Movimento->setCalcCliente($calcCdx);
        //    $Movimento->setCalcCdx($calcCliente);
        //}else{
        //    $Movimento->setCalcCliente($calcCliente);
        //    $Movimento->setCalcCdx($calcCdx);
        //}

        $Movimento->setCalcCliente(number_format($calcCliente,7,'.',''));
        $Movimento->setCalcAdquirente(number_format($calcAdquirente,7,'.',''));
        $Movimento->setCalcPolo(number_format($calcPolo,7,'.',''));
        $Movimento->setCalcRepresentante(number_format($calcRepresentante,7,'.',''));
        $Movimento->setDataRepasse($dataRepasse);
        $Movimento->setCodCliMovingPay($codCliMovingPay);

        if($origem != "POS" && $origem != "WEB" && $origem != "TOTEM" ){
        //if($origem != "WEB" && $origem != "TOTEM" ){
            $Movimento->setCalcAdquirente(intval(($valor * $parcelas) - $valorOriginal)/100);
            if(isset($resultado->data_inicial_transacao)){
                $Movimento->setData($resultado->data_inicial_transacao);
            }else{
                $Movimento->setData($data_inicial_transacao);
            }

        }

        if(strtoupper($servico) == "VENDASEDI" || $servico == "VendasSoftwareExpress"){
            //$dataHoje = date('Y-m-d');
            //$Movimento->setDataRepasse($dataHoje);
            if(isset($resultado->data_inicial_transacao)){
                $Movimento->setData($resultado->data_inicial_transacao);
            }else{
                $Movimento->setData($data_inicial_transacao);
            }

        }

        $Movimento->inserir();

        $idTransacao = $Movimento->getId();

        if($servico == "Estorno"){
            //gravo a original como estornada
            $Movimento->setId($itemEstorno->id);
            $Movimento->setIdEstorno($idTransacao);
            $Movimento->gravaEstorno();
        }

        //quando houver dados do veiculo, enviado pelo SinPag, cadastrar as informacoes do debito
        if(isset($resultado->extraData)){
            try {

                $Veiculos = new MovimentacoesVeiculosCtl();
                $Veiculos->setIdMovimentacoes($idTransacao);
                $Veiculos->setPlaca($resultado->extraData->placa);
                $Veiculos->setRenavam($resultado->extraData->renavam);
                $Veiculos->setDescricao("Telefone: ".$resultado->extraData->telefone);
                $Veiculos->inserir();

            }catch (Exception $e){

            }

            try {
                $Movimento->setId($idTransacao);
                $Movimento->setIdSinpag($resultado->extraData->referencia);
                $Movimento->gravaEnvioSinPag();
            }catch (Exception $e){

            }

        }

        $retorno = array("status" => true,
            "id"=>$idTransacao,
            "retorno"=>$Movimento->getMensagemRetorno()
        );
    }else{
        $retorno = array("status" => false, "motivoCritica" => 'Dados invalidos!');
    }




}else{
    $retorno = array("status" => false, "motivoCritica" => 'Requisição Vazia!');
}

echo json_encode($retorno,  JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);