<?php

include "../controllers/ClienteCtl.php";
include "../controllers/ConfigCtl.php";
//include "../controllers/ComprovantesCtl.php";
include "../controllers/AcessoExternoCtl.php";
include "gerarToken.php";
include "gravaHistoricos.php";

$protocol = (isset($_SERVER['SERVER_PROTOCOL']) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0');

if( $_SERVER['REQUEST_METHOD'] !== "POST" ){
    $retorno = array("status" => false, "motivoCritica" => 'Somente permitido método POST!');
    $code = 401;
    header($protocol . ' ' . $code);
    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['feeladagatoken']) || is_null($header['feeladagatoken'])){
    $retorno = array("status" => false, "motivoCritica" => 'Segurança: informação vazia.');
    $code = 402;
    header($protocol . ' ' . $code);
    echo json_encode($retorno,  JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    exit();
}

$jwt = $header['feeladagatoken'];

$json = file_get_contents('php://input');
if (empty($json) || is_null($json)){
    $retorno = array("status" => false, "motivoCritica" => 'Requisição Vazia!');
    $code = 403;
    header($protocol . ' ' . $code);
    echo json_encode($retorno,  JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
    exit();
}

//efeuta o teste do Token
$dadosToken = abreToken($jwt, 'N^vs8g$d$nm&');
if ($dadosToken == "ERRO") {
    $code = 404;
    header($protocol . ' ' . $code);
    $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)) {

    $Acesso = new AcessoExternoCtl();
    $Acesso->setToken($jwt);
    $Acesso->setConta($dadosToken->id);
    $resAcesso = $Acesso->getAcesso();
    if($resAcesso->rowCount() > 0){
        $dadosAcesso = $resAcesso->fetch(PDO::FETCH_OBJ);

        if($dadosAcesso->documento == $resultado->documento){
            $atarId = $dadosAcesso->conta;

            $valor = $resultado->valor;
            $identificador = $resultado->identificador;
            $descricao = $resultado->descricao;

            $key = $resultado->key;
            $tipo = $resultado->type;
            $dataHora = "";
            $favorito = false;
            $status = "active";
            $dataStatus = "";
            $instituicao = $resultado->institution;
            $nomeInstituicao =$resultado->institutionName;
            $agencia = $resultado->branch;
            $conta = $resultado->accountNumber;
            $tipoConta = $resultado->accountType;
            $nome = $resultado->name;
            $documento = $resultado->document;
            $emv = $resultado->key;
            $txId = $resultado->txId;

            if (isset($atarId)){
                //$txId = "";

                $novaEmv = urlencode($txId);
                $novaEmv = str_replace('+','%20',$txId);

                if ($resultado->forma == "qrcode"){
                    $txId = $novaEmv;
                }

                $Config = new ConfigCtl();
                $dadosConfig = $Config->getConfig()->fetch(PDO::FETCH_OBJ);
                $url = $dadosConfig->url_extrato."/pix/payment";
                $user = $dadosConfig->user;
                $pass = $dadosConfig->password;

                $destino = array("key"=>$key,
                    "type"=>$tipo,
                    "timestamp"=>strval(time()),
                    "isFavorite"=>$favorito,
                    "status"=>$status,
                    "statusResolutionTimestamp"=>strval(time()),
                    "institution"=>$instituicao,
                    "institutionName"=>$nomeInstituicao,
                    "branch"=>$agencia,
                    "accountNumber"=>$conta,
                    "accountType"=>$tipoConta,
                    "name"=>$nome,
                    "document"=>$documento,
                    "emv"=>$novaEmv
                );

                $dadosEnvio = json_encode(array("txId"=>$txId,
                    "amount"=>intval($valor),
                    //"identifier"=>$identificador,
                    "description"=>$descricao,
                    "to"=>$destino
                ));

                $ch = curl_init();

                curl_setopt($ch, CURLOPT_URL, $url);
                curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
                curl_setopt($ch, CURLOPT_POST, true);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $dadosEnvio);
                curl_setopt( $ch, CURLOPT_HTTPHEADER, array('Authorization: Basic ' . base64_encode( $user . ':' . $pass ) ,
                        'Atar-ApiKey:'.$dadosConfig->api_key,
                        'Atar-ID:'.$atarId,
                        'Content-Type: application/json',
                        'Content-Length: ' . strlen($dadosEnvio)
                    )
                );

                $result = curl_exec($ch);
                $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);

                curl_close($ch);

                $consulta = json_decode($result);

                if (!empty($consulta) && $httpCode == 200)
                {
                    //grava comprovantes na base
                    try {
                        $Cliente = new ClienteCtl();
                        $Cliente->setCodContaBancaria($atarId);
                        $resCliente = $Cliente->getClientePorAtarId();
                        if($Cliente->getRetorno() == "OK"){
                            $cliDados = $resCliente->fetch(PDO::FETCH_OBJ);

                            //grava comprovante
                            //$Comprovantes = new ComprovantesCtl();
                            //$Comprovantes->setCliId($cliDados->cli_id);
                            //$Comprovantes->setCmpTipo("PIX");
                            //$Comprovantes->setCmpData(date('Y-m-d H:i:s'));
                            //$Comprovantes->setCmpValor($valor/100);
                            //$Comprovantes->setCmpDados(json_encode($consulta));
                            //$gravaComp = $Comprovantes->inserir();

                            gravaComprovante($cliDados->cli_id,"PIX",$valor,$consulta);
                            gravaListaPix($cliDados->cli_id,$key,$tipo,$nome);
                        }
                    }catch (Exception $e) {

                    }

                    $retorno = array("status" => true,
                        "dados" => $consulta);

                }else{
                    $mensagem = "Ocorreu um problema ao transferir.";

                    switch ($httpCode){

                        case "401": $mensagem="Usuário não autorizado.";
                            break;
                        case "402": $mensagem="Saldo insuficiente.";
                            break;
                        case "404": $mensagem="Chave nao encontrada.";
                            break;
                        case "412": $mensagem="Limite da conta excedido.";
                            break;
                        case "500": $mensagem="Erro interno.";
                            break;
                    }
                    $retorno = array("status" => false, "motivoCritica" => $mensagem,"dados"=>$consulta,"HTTPCODE"=>$httpCode,"dadosEnvio"=>$dadosEnvio);
                }


            }else{

                $retorno = array("status" => false, "motivoCritica" => 'Não há dados para listar.');
            }

        }else{
            $code = 405;
            header($protocol . ' ' . $code);

            $retorno = array("status" => false, "motivoCritica" => 'Dados de acesso inválido!');
        }

    }else{
        $code = 406;
        header($protocol . ' ' . $code);
        $retorno = array("status" => false, "motivoCritica" => 'Não encontrado dados de acesso!');
    }

}else{
    $code = 407;
    header($protocol . ' ' . $code);
    $retorno = array("status" => false, "motivoCritica" => 'Requisição Vazia!');
}

echo json_encode($retorno,  JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);
