<?php $include_config_geral = '../../fncr-geral/configuracao_geral.php';

$acao=isset($_POST['acao'])?$_POST['acao']:'';

// Iniciais
if($acao!=""){
  include($include_config_geral);
}


// ************************
// PIX
// ************************

// GERANDO PEDIDO
if($acao=="pix_generator"){

  $id_registro = $_POST['id_registro'];

  // Dados do registro
  $sql = $bd->getConexao()->prepare('
    SELECT
      fin.*,
      pix.id as pix_id,
      pix.fullcode as pix_fullcode,
      pix.txid as pix_txid,
      pix.pago as pix_pago,
      pix.cancelado as pix_cancelado,
      c.endereco as clube_endereco,
      c.cidade as clube_cidade,
      c.uf as clube_uf,
      c.cep as clube_cep,
      c.cnpj as clube_cnpj,
      c.razao as clube_razao,
      c.cpf as clube_cpf,
      c.contato as clube_contato,
      config.link_sistema
    FROM clubes_financeiro fin
      LEFT JOIN clubes c ON c.id = fin.id_clube
      LEFT JOIN clubes_pix pix ON pix.id = fin.id_pix AND (NOW() <= pix.data_hora_expire OR pix.pago = 1)
      LEFT JOIN clubes_configuracao config ON config.id_clube = c.id
    WHERE fin.id = :id');
  $sql->bindValue(':id', $id_registro, PDO::PARAM_STR);
  if($sql->execute()){$resul_reg = $sql->fetch(PDO::FETCH_ASSOC);}

  // Se fatura continua aberta
  if($resul_reg['id']!="" && ($resul_reg['status']=="2" or $resul_reg['status']=="3" or $resul_reg['status']=="7")){

    // Gerar pix
    if($resul_reg['pix_id']==null){
      echo json_encode(["resultado"=>"erro"]);
      exit;

      include_once('../../libraries/outros/PixSicredi.php');
      include_once('../../libraries/outros/PixQrCode.php');

      $pixApi = new PixSicredi();
      $pixApi->tokenGenerator();

      // PREPARANDO DATA
      $number = explode('.', $resul_reg['documento']);

      $txid  = '';
      $txid .= 'cb'.zeroEsq($resul_reg['id_clube'], 4);    // total de 6
      $txid .= 'nm'.zeroEsq($number[1], 3);    // total de 5
      $txid .= 'py'.zeroEsq($resul_reg['periodo_ano'], 2);   // total de 4
      $txid .= 'pm'.zeroEsq($resul_reg['periodo_mes'], 2);    // total de 4
      $txid .= 'cd'.gerarSenha(9);      // total de 11 (completa 30 no total)

      $data = array(
        "calendario"=> array("expiracao"=> 45000), // 2:30 Horas (limitar no bd à 2 horas) / 12h = 43.200 / 12:30h = 45.000 / 3.600 (1h)
        "devedor"=> array(
          "logradouro"=> $resul_reg['clube_endereco'],
          "cidade"=> $resul_reg['clube_cidade'],
          "uf"=> $resul_reg['clube_uf'],
          "cep"=> $resul_reg['clube_cep']
        ),
        "valor"=> array(
          "original"=> $resul_reg['valor']
        ),
        "chave"=> GLOBAL_PIX_CHAVE
      );

      if($resul_reg['clube_cnpj']!=""){
        $data['devedor']['cnpj'] = preg_replace('/[^0-9]/', "", $resul_reg['clube_cnpj']);
        $data['devedor']['nome'] = $resul_reg['clube_razao'];
      }else{
        $data['devedor']['cpf'] = preg_replace('/[^0-9]/', "", $resul_reg['clube_cpf']);
        $data['devedor']['nome'] = $resul_reg['clube_contato'];
      }

      $pixApi->createCob($txid, json_encode($data));

      if($pixApi->location){
        // Cria registro do pix no BD
        $sql = $bd->getConexao()->prepare('INSERT INTO clubes_pix
            (id_clube, id_financeiro, txid, valor, data_hora_emissao, data_hora_expire) VALUES
            (:id_clube, :id_financeiro, :txid, :valor, NOW(), DATE_ADD(NOW(), INTERVAL :seconds SECOND))');
        $sql->bindValue(':id_clube', $resul_reg['id_clube'], PDO::PARAM_STR);
        $sql->bindValue(':id_financeiro', $resul_reg['id'], PDO::PARAM_STR);
        $sql->bindValue(':txid', $txid, PDO::PARAM_STR);
        $sql->bindValue(':valor', $resul_reg['valor'], PDO::PARAM_STR);
        $sql->bindValue(':seconds', 43200, PDO::PARAM_STR);
        if($sql->execute());

        $id_pix = $bd->lastId();

        // Inclui no registro do financeiro, ID do registro do pix criado
        $sql = $bd->getConexao()->prepare('UPDATE clubes_financeiro SET
              id_pix = :id_pix
            WHERE id = :id');
        $sql->bindValue(':id', $resul_reg['id'], PDO::PARAM_STR);
        $sql->bindValue(':id_pix', $id_pix, PDO::PARAM_STR);
        if($sql->execute());

        $pix = new PixQrCode();
        $pix->url = $pixApi->location;
        $codeQrCode = $pix->rum();

        // Registra o código completo do QrCode
        $sql = $bd->getConexao()->prepare('UPDATE clubes_pix SET
              fullcode = :fullcode
            WHERE id = :id');
        $sql->bindValue(':id', $id_pix, PDO::PARAM_STR);
        $sql->bindValue(':fullcode', $codeQrCode, PDO::PARAM_STR);
        if($sql->execute());
      }

    }

    $json = array(
      "resultado"=>"ok",
      "fullcode"=> $resul_reg['pix_fullcode']!="" ? $resul_reg['pix_fullcode'] : $codeQrCode,
      "link_ext"=> "https://".$resul_reg['link_sistema'].".pokerweb.com.br/fatura/extrato.php?f=".$id_registro."&h=".md5($id_registro*99),
    );
  }
  if(!isset($json)){
    $json = array("resultado"=>"erro");
  }
  echo json_encode($json);
}




// ************************
// PAYPAL
// ************************

function paypalTokenGenerator(){
  // TOKEN
  $ClientID = 'Ae1jUR5QkNRyUuTy17Flc6hBc7oJFqPXqt8ngckN9NmpboRq0DrNtqbHpBfwyadBYi6z3xo_gwoqwr0f';
  $ClientSecret = 'ECe6R-SChyVE28eXZjWAp107fzxKGoY2Kf31AK_U1GmGu9uotLGq7hYyFm7qKPlHuEUiU4Df7zpqjQi-';
  $Basic = base64_encode($ClientID.':'.$ClientSecret);

  $curl = curl_init();
  curl_setopt_array($curl, [
    CURLOPT_URL => "https://api-m.sandbox.paypal.com/v1/oauth2/token",
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_ENCODING => "",
    CURLOPT_MAXREDIRS => 10,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => "grant_type=client_credentials",
    CURLOPT_HTTPHEADER => [
      "Authorization: Basic ".$Basic,
      "Content-Type: application/x-www-form-urlencoded"
    ],
  ]);

  $response = curl_exec($curl);
  $err = curl_error($curl);
  curl_close($curl);

  $dados = json_decode($response, true);
  $access_tk = $dados['access_token'];

  return !$err ? $access_tk : false;
}


// GERANDO PEDIDO
if($acao=="paypal_order"){

  $id_registro = $_POST['id_registro'];

  // Dados do registro
  $sql = $bdfn->getConexao()->prepare('
  SELECT
    fin.*,
    moeda.moeda_code
  FROM clubes_financeiro fin
    LEFT JOIN _pw.local_pais moeda ON moeda.id = fin.id_moeda
  WHERE fin.id = :id');
  $sql->bindValue(':id', $id_registro, PDO::PARAM_STR);
  if($sql->execute()){$resul_reg = $sql->fetch(PDO::FETCH_ASSOC);}

  if($resul_reg['id']!="" && ($resul_reg['status']=="2" or $resul_reg['status']=="3" or $resul_reg['status']=="7")){
    $access_tk = paypalTokenGenerator();
    if($access_tk){

      $pedido = array();

      $pedido['intent'] = 'sale';
      $pedido['payer']['payment_method'] = 'paypal';
      $pedido['experience_profile_id'] = 'XP-RCY8-LVBA-C2A4-87WS';
      $pedido['transactions'][0]['amount']['currency'] = $resul_reg['moeda_code'];
      $pedido['transactions'][0]['amount']['total'] = $resul_reg['valor'];

      $pedido['transactions'][0]['description'] = 'PokerWeb - '.$resul_reg['descricao'].' - '._t("Período",1).': '.$resul_reg['periodo_mes'].'/20'.$resul_reg['periodo_ano'];
      $pedido['transactions'][0]['payment_options']['allowed_payment_method'] = 'IMMEDIATE_PAY';

      $pedido['transactions'][0]['item_list']['items'][0]['name'] = 'PokerWeb - '.$resul_reg['descricao'];
      $pedido['transactions'][0]['item_list']['items'][0]['description'] = _t("Período",1).': '.$resul_reg['periodo_mes'].'/20'.$resul_reg['periodo_ano'];
      $pedido['transactions'][0]['item_list']['items'][0]['quantity'] = '1';
      $pedido['transactions'][0]['item_list']['items'][0]['price'] = $resul_reg['valor'];
      $pedido['transactions'][0]['item_list']['items'][0]['sku'] = $resul_reg['documento'];
      $pedido['transactions'][0]['item_list']['items'][0]['currency'] = $resul_reg['moeda_code'];

      //$pedido['redirect_urls']['return_url'] = 'https://example.com/return';
      //$pedido['redirect_urls']['cancel_url'] = 'https://example.com/cancel';
      $pedido['redirect_urls']['return_url'] = 'https://pokerweb.com.br/';
      $pedido['redirect_urls']['cancel_url'] = 'https://pokerweb.com.br/';

      $curl = curl_init();
      curl_setopt_array($curl, [
        CURLOPT_URL => "https://api-m.sandbox.paypal.com/v1/payments/payment",
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => "",
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 30,
        CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
        CURLOPT_CUSTOMREQUEST => "POST",
        CURLOPT_POSTFIELDS => json_encode($pedido),
        CURLOPT_HTTPHEADER => [
          "Authorization: Bearer ".$access_tk,
          "Content-Type: application/json"
        ],
      ]);

      $response = curl_exec($curl);
      $err = curl_error($curl);
      curl_close($curl);

      if(!$err){
        $dados = json_decode($response, true);
        $order_id = $dados['id'];
        foreach($dados['links'] as $l){
          if($l['rel']=='approval_url'){
            $approval_url = $l['href'];
          }
        }
        $json = array(
          "resultado"=>"ok",
          "approval_url"=>$approval_url,
          "order_id"=>$order_id,
        );

        $sql = $bdfn->getConexao()->prepare('UPDATE clubes_financeiro SET paypal_order = :paypal_order WHERE id = :id');
        $sql->bindValue(':paypal_order', $order_id, PDO::PARAM_STR);
        $sql->bindValue(':id', $id_registro, PDO::PARAM_STR);
        if($sql->execute());
      }
    }
  }
  if(!isset($json)){
    $json = array("resultado"=>"erro");
  }
  echo json_encode($json);
}


// EXECUTAR PAGAMENTO
if($acao=="paypal_payment_execute"){

  $orderId = $_POST['orderId'];
  $payerId = $_POST['payerId'];

  $access_tk = paypalTokenGenerator();
  if($access_tk){

    $curl = curl_init();
    curl_setopt_array($curl, [
      CURLOPT_URL => "https://api-m.sandbox.paypal.com/v1/payments/payment/".$orderId."/execute/",
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_ENCODING => "",
      CURLOPT_MAXREDIRS => 10,
      CURLOPT_TIMEOUT => 30,
      CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
      CURLOPT_CUSTOMREQUEST => "POST",
      CURLOPT_POSTFIELDS => '{"payer_id": "'.$payerId.'"}',
      CURLOPT_HTTPHEADER => [
        "Authorization: Bearer ".$access_tk,
        "Content-Type: application/json"
      ],
    ]);

    $response = curl_exec($curl);
    $err = curl_error($curl);
    curl_close($curl);

    if(!$err){
      $dados = json_decode($response, true);
      if($dados['state']=="approved" && $dados['transactions'][0]['related_resources'][0]['sale']['state']=="completed"){

        // CONFIRMAR PAGAMENTO NO FNCR
        // =======================================

        // Dados do registro
        $sql = $bdfn->getConexao()->prepare('SELECT * FROM clubes_financeiro WHERE paypal_order = :paypal_order');
        $sql->bindValue(':paypal_order', $orderId, PDO::PARAM_STR);
        if($sql->execute()){$resul_reg = $sql->fetch(PDO::FETCH_ASSOC);}

        // Valor de Conversão
        $valor_conversao = $dados['transactions'][0]['related_resources'][0]['sale']['exchange_rate'];                // Cotação de conversão da moeda do cliente para da PokerWeb

        // Moeda de Origem (Cliente)
        $valor_pago_origem = $dados['transactions'][0]['amount']['total'];                                            // Valor pago
        $valor_fee_origem = $dados['transactions'][0]['related_resources'][0]['sale']['transaction_fee']['value'];    // Valor descontado pelo serviço
        $valor_liberado_origem = $valor_pago_origem - $valor_fee_origem;                                              // Valor líquido

        // Moeda PW (Real)
        $valor_pago_pw = $valor_pago_origem * $valor_conversao;
        $valor_fee_pw = $valor_fee_origem * $valor_conversao;
        $valor_liberado_pw = $dados['transactions'][0]['related_resources'][0]['sale']['receivable_amount']['value'];  // Valor recebido

        // Atualizar informações do registro
        $sql = $bdfn->getConexao()->prepare('UPDATE clubes_financeiro SET
          data_pgto = NOW(),
          data_notificacao = NOW(),
          data_liberacao = NOW(),
          valor_pago = :valor_pago,
          valor_liberado = :valor_liberado,
          valor_desc_pag = :valor_desc_pag,
          valor_pendente = 0,
          conversao_cotacao = :conversao_cotacao,
          status = 4
          WHERE id = :id AND status > 0');
        $sql->bindValue(':valor_pago', $valor_pago_origem, PDO::PARAM_STR);
        $sql->bindValue(':valor_desc_pag', $valor_fee_origem, PDO::PARAM_STR);
        $sql->bindValue(':valor_liberado', $valor_liberado_origem, PDO::PARAM_STR);
        $sql->bindValue(':conversao_cotacao', $valor_conversao, PDO::PARAM_STR);
        $sql->bindValue(':id', $resul_reg['id'], PDO::PARAM_STR);
        if($sql->execute());

        // Inserindo Registros do pagamento total no Financeiro Geral (sem descontos do paypal)
        $sql = $bdfn->getConexao()->prepare('INSERT INTO fingeral_registros
        (id_categoria, id_conta, id_clube, id_clube_financeiro, valor, periodo_mes, periodo_ano, data_lancamento, data_vencimento, data_pagamento, pagar_automatico, status_pago, status) VALUES
        (63, 2, :id_clube, :id_clube_financeiro, :valor, :periodo_mes, :periodo_ano, NOW(), NOW(), NOW(), 1, 1, 0)');
        $sql->bindValue(':id_clube', $resul_reg['id_clube'], PDO::PARAM_STR);
        $sql->bindValue(':id_clube_financeiro', $resul_reg['id'], PDO::PARAM_STR);
        $sql->bindValue(':valor', $valor_pago_pw, PDO::PARAM_STR);
        $sql->bindValue(':periodo_mes', $resul_reg['periodo_mes'], PDO::PARAM_STR);
        $sql->bindValue(':periodo_ano', $resul_reg['periodo_ano'], PDO::PARAM_STR);
        if($sql->execute());

        // Inserindo Registros das taxas cobradas pelo serviço (PayPal - Taxas 116)
        $sql = $bdfn->getConexao()->prepare('INSERT INTO fingeral_registros
        (id_categoria, id_conta, id_clube, id_clube_financeiro, valor, periodo_mes, periodo_ano, data_lancamento, data_vencimento, data_pagamento, pagar_automatico, status_pago, status) VALUES
        (116, 2, :id_clube, :id_clube_financeiro, :valor, :periodo_mes, :periodo_ano, NOW(), NOW(), NOW(), 1, 1, 0)');
        $sql->bindValue(':id_clube', $resul_reg['id_clube'], PDO::PARAM_STR);
        $sql->bindValue(':id_clube_financeiro', $resul_reg['id'], PDO::PARAM_STR);
        $sql->bindValue(':valor', $valor_fee_pw*-1, PDO::PARAM_STR);
        $sql->bindValue(':periodo_mes', $resul_reg['periodo_mes'], PDO::PARAM_STR);
        $sql->bindValue(':periodo_ano', $resul_reg['periodo_ano'], PDO::PARAM_STR);
        if($sql->execute());

        // Liberar Clube se bloqueado
        if($resul_reg['bloq_status_clube']==0){
          // Liberar Clube se bloqueado
          $sql = $bdfn->getConexao()->prepare('UPDATE clubes SET bloqueio = 0 WHERE id = :id');
          $sql->bindValue(':id', $resul_reg['id_clube'], PDO::PARAM_STR);
          if($sql->execute());

          // Inserir Registro de Status
          $sql = $bdfn->getConexao()->prepare('INSERT INTO clubes_financeiro_datas
          (id_financeiro, data, hora, status, origem) VALUES
          (:id_financeiro, NOW(), NOW(), 4, 2)');
          $sql->bindValue(':id_financeiro', $resul_reg['id'], PDO::PARAM_STR);
          if( $sql->execute() );
        }

        $json = array("resultado"=>"ok");
      }
    }
  }
  if(!isset($json)){
    $json = array("resultado"=>"erro");
  }
  echo json_encode($json);
}




$bd = null; $bd_fn = null;

?>