<?php

class DModelPaymentPaymentInfo extends Model
{

  public function addPaymentCreditCard($data)
  {
    $this->load->helper('Ftr_sql');

    $sqlInsert = Ftr_sql::generateInsert('oc_payment_credit_card',
      [ 'tid', 'numero_autorizacao', 'cod_autorizacao', 'mensagem_retorno', 'order_id', 'valor_pagamento',
        'data_pagamento', 'tipo_cartao', 'cartao_mascara', 'cartao_bandeira', 'cartao_bandeira_text', 'qtd_parcela', 'valor_acrescimo',
        'banco_emissor', 'status_pagamento','status_retorno', 'cod_retorno', 'payment_id',
        'moeda', 'idioma', 'nsu' , 'refound_id','cancel_id','status_captura' ]);

    $paymentinfos[] = isset($data['tid']) ? $data['tid'] : '';
    $paymentinfos[] = isset($data['numero_autorizacao']) ? $data['numero_autorizacao'] : null;
    $paymentinfos[] = isset($data['cod_autorizacao']) ? $data['cod_autorizacao'] : null;
    $paymentinfos[] = isset($data['mensagem_retorno']) ? $data['mensagem_retorno'] : null;
    $paymentinfos[] = isset($data['order_id']) ? $data['order_id'] : null;
    $paymentinfos[] = isset($data['valor_pagamento']) ? $data['valor_pagamento'] : null;
    $paymentinfos[] = isset($data['data_pagamento']) ? $data['data_pagamento'] : null;
    $paymentinfos[] = isset($data['tipo_cartao']) ? $data['tipo_cartao'] : null;
    $paymentinfos[] = isset($data['cartao_mascara']) ? $data['cartao_mascara'] : null;
    $paymentinfos[] = isset($data['cartao_bandeira']) ? $data['cartao_bandeira'] : null;
    $paymentinfos[] = isset($data['cartao_bandeira_text']) ? $data['cartao_bandeira_text'] : null;
    $paymentinfos[] = isset($data['qtd_parcela']) ? $data['qtd_parcela'] : null;
    $paymentinfos[] = isset($data['valor_acrescimo']) ? $data['valor_acrescimo'] : null;
    $paymentinfos[] = isset($data['banco_emissor']) ? $data['banco_emissor'] : null;
    $paymentinfos[] = isset($data['status_pagamento']) ? $data['status_pagamento'] : null;
    $paymentinfos[] = isset($data['status_retorno']) ? $data['status_retorno'] : null;
    $paymentinfos[] = isset($data['cod_retorno']) ? $data['cod_retorno'] : null;
    $paymentinfos[] = isset($data['payment_id']) ? $data['payment_id'] : null;
    $paymentinfos[] = isset($data['moeda']) ? $data['moeda'] : null;
    $paymentinfos[] = isset($data['idioma']) ? $data['idioma'] : null;
    $paymentinfos[] = isset($data['nsu']) ? $data['nsu'] : null;
    $paymentinfos[] = isset($data['refound_id']) ? $data['refound_id'] : null;
    $paymentinfos[] = isset($data['cancel_id']) ? $data['cancel_id'] : null;
    $paymentinfos[] = isset($data['status_captura']) ? $data['status_captura'] : null;

    $this->db->executeSql($sqlInsert, $paymentinfos);
  }

  public function addPaymentDebitCard($data)
  {
    $this->load->helper('Ftr_sql');

    $sqlInsert = Ftr_sql::generateInsert('oc_payment_debit_card',
      [ 'tid', 'numero_autorizacao', 'cod_autorizacao', 'mensagem_retorno', 'order_id', 'valor_pagamento',
        'data_pagamento', 'tipo_cartao', 'cartao_mascara', 'cartao_bandeira', 'cartao_bandeira_text',
        'banco_emissor', 'status_pagamento','status_retorno', 'cod_retorno', 'payment_id',
        'moeda', 'idioma', 'nsu' , 'refound_id','cancel_id','status_captura' ]);

    $paymentinfos[] = isset($data['tid']) ? $data['tid'] : '';
    $paymentinfos[] = isset($data['numero_autorizacao']) ? $data['numero_autorizacao'] : null;
    $paymentinfos[] = isset($data['cod_autorizacao']) ? $data['cod_autorizacao'] : null;
    $paymentinfos[] = isset($data['mensagem_retorno']) ? $data['mensagem_retorno'] : null;
    $paymentinfos[] = isset($data['order_id']) ? $data['order_id'] : null;
    $paymentinfos[] = isset($data['valor_pagamento']) ? $data['valor_pagamento'] : null;
    $paymentinfos[] = isset($data['data_pagamento']) ? $data['data_pagamento'] : null;
    $paymentinfos[] = isset($data['tipo_cartao']) ? $data['tipo_cartao'] : null;
    $paymentinfos[] = isset($data['cartao_mascara']) ? $data['cartao_mascara'] : null;
    $paymentinfos[] = isset($data['cartao_bandeira']) ? $data['cartao_bandeira'] : null;
    $paymentinfos[] = isset($data['cartao_bandeira_text']) ? $data['cartao_bandeira_text'] : null;
    $paymentinfos[] = isset($data['banco_emissor']) ? $data['banco_emissor'] : null;
    $paymentinfos[] = isset($data['status_pagamento']) ? $data['status_pagamento'] : null;
    $paymentinfos[] = isset($data['status_retorno']) ? $data['status_retorno'] : null;
    $paymentinfos[] = isset($data['cod_retorno']) ? $data['cod_retorno'] : null;
    $paymentinfos[] = isset($data['payment_id']) ? $data['payment_id'] : null;
    $paymentinfos[] = isset($data['moeda']) ? $data['moeda'] : null;
    $paymentinfos[] = isset($data['idioma']) ? $data['idioma'] : null;
    $paymentinfos[] = isset($data['nsu']) ? $data['nsu'] : null;
    $paymentinfos[] = isset($data['refound_id']) ? $data['refound_id'] : null;
    $paymentinfos[] = isset($data['cancel_id']) ? $data['cancel_id'] : null;
    $paymentinfos[] = isset($data['status_captura']) ? $data['status_captura'] : null;

    $this->db->executeSql($sqlInsert, $paymentinfos);
  }

  public function updatePaymentCreditCard($data)
  {
    $this->load->helper('Ftr_sql');
    $fieldList = array();
    $fieldValues = array();

    foreach ($data as $key => $value){
      if ($key != 'order_id'){
        $fieldList[] = $key;
        $fieldValues[] = $value;
      }
    }

    $sqlUpdate = Ftr_sql::generateUpdate('oc_payment_credit_card', $fieldList , 'order_id = '.$data['order_id'] );
    $this->db->executeSql($sqlUpdate, $fieldValues);
  }


  public function addPaymentBillit($data)
  {
    $this->load->helper('Ftr_sql');

    $sqlInsert = Ftr_sql::generateInsert('oc_payment_billet',
      ['numero_autorizacao', 'cod_autorizacao', 'link_boleto', 'link_digitavel', 'order_id','banco_emissor','data_vencimento','status_pagamento','data_criacao','link_barcode','link_qrcode']);

    $paymentinfos[] = isset($data['numero_autorizacao']) ? $data['numero_autorizacao'] : null;
    $paymentinfos[] = isset($data['cod_autorizacao']) ? $data['cod_autorizacao'] : null;
    $paymentinfos[] = isset($data['link_boleto']) ? $data['link_boleto'] : null;
    $paymentinfos[] = isset($data['link_digitavel']) ? $data['link_digitavel'] : null;
    $paymentinfos[] = isset($data['order_id']) ? $data['order_id'] : null;
    $paymentinfos[] = isset($data['banco_emissor']) ? $data['banco_emissor'] : null;
    $paymentinfos[] = isset($data['data_vencimento']) ? $data['data_vencimento'] : null;
    $paymentinfos[] = isset($data['status_pagamento']) ? $data['status_pagamento'] : null;
    $paymentinfos[] = isset($data['data_criacao']) ? $data['data_criacao'] : null;
    $paymentinfos[] = isset($data['link_barCode']) ? $data['link_barCode'] : null;
    $paymentinfos[] = isset($data['link_qrCode']) ? $data['link_qrCode'] : null;

    $this->db->executeSql($sqlInsert, $paymentinfos);

  }

  public function addPaymentPix($data){
    $this->load->helper('Ftr_sql');

    $sqlInsert = Ftr_sql::generateInsert('oc_payment_pix',
      ['payment_pix_id', 'order_id', 'payment_id', 'data_criacao', 'data_vencimento','status_pagamento','link_qrcodeurl','link_qrcode']);

    $paymentinfos[] = $data['payment_pix_id'] ?? null;
    $paymentinfos[] = $data['order_id'] ?? null;
    $paymentinfos[] = $data['payment_id'] ?? null;
    $paymentinfos[] = $data['data_criacao'] ?? null;
    $paymentinfos[] = $data['data_vencimento'] ?? null;
    $paymentinfos[] = $data['status_pagamento'] ?? null;
    $paymentinfos[] = $data['link_qrcodeurl'] ?? null;
    $paymentinfos[] = $data['link_qrcode'] ?? null;

    $this->db->executeSql($sqlInsert, $paymentinfos);
  }

  public function updatePaymentBillet($data)
  {
    $this->load->helper('Ftr_sql');
    $fieldList = array();
    $fieldValues = array();

    foreach ($data as $key => $value){
      if ($key != 'order_id'){
        $fieldList[] = $key;
        $fieldValues[] = $value;
      }
    }

    $sqlUpdate = Ftr_sql::generateUpdate('oc_payment_billet', $fieldList , 'order_id = '.$data['order_id'] );
    $this->db->executeSql($sqlUpdate, $fieldValues);
  }

  public function addPaymentBankTransfer($data)
  {
    $this->load->helper('Ftr_sql');

    $sqlInsert = Ftr_sql::generateInsert('oc_payment_bank_transfer',
      ['numero_autorizacao', 'cod_autorizacao', 'link_payment', 'order_id', 'banco_pagamento','data_criacao','status_pagamento']);

    $paymentinfos[] = isset($data['numero_autorizacao']) ? $data['numero_autorizacao'] : null;
    $paymentinfos[] = isset($data['cod_autorizacao']) ? $data['cod_autorizacao'] : null;
    $paymentinfos[] = isset($data['link_payment']) ? $data['link_payment'] : null;
    $paymentinfos[] = isset($data['order_id']) ? $data['order_id'] : null;
    $paymentinfos[] = isset($data['banco_pagamento']) ? $data['banco_pagamento'] : null;
    $paymentinfos[] = isset($data['data_criacao']) ? $data['data_criacao'] : null;
    $paymentinfos[] = isset($data['status_pagamento']) ? $data['status_pagamento'] : null;

    $this->db->executeSql($sqlInsert, $paymentinfos);
  }

  public function updatePaymentBankTransfer($data)
  {
    $this->load->helper('Ftr_sql');
    $fieldList = array();
    $fieldValues = array();

    foreach ($data as $key => $value){
      if ($key != 'order_id'){
        $fieldList[] = $key;
        $fieldValues[] = $value;
      }
    }

    $sqlUpdate = Ftr_sql::generateUpdate('oc_payment_bank_transfer', $fieldList , 'order_id = '.$data['order_id'] );
    $this->db->executeSql($sqlUpdate, $fieldValues);
  }


  public function getPaymentInfo($order_id,$tipo_pagamento,$first=true,$order="ASC")
  {
    $this->load->type('tipocomum');

    $tabela = Type_PagamentoTabela::getNickFromValue($tipo_pagamento);
    $sql = "SELECT * FROM ".$tabela." WHERE `order_id` = ".(int) $order_id;
    $sql .= $first ? " order by 1 ".$order. " limit 1" : "";
    $query =   $this->db->query($sql);

    return ($query->rows) ? ($first ? $query->row : $query->rows) : false;
  }

    public function getPaymentInfoByTransactionId($transaction_field, $transaction_id, $tipo_pagamento, $first=true, $order="ASC")
    {
        $this->load->type('tipocomum');

        $tabela = Type_PagamentoTabela::getNickFromValue($tipo_pagamento);
        $sql = "SELECT * FROM ".$tabela." WHERE " . $transaction_field . " = '" . $transaction_id . "'";
        $sql .= $first ? " order by 1 ".$order. " limit 1" : "";
        $query =   $this->db->query($sql);

        return ($query->rows) ? ($first ? $query->row : $query->rows) : false;
    }

  public function checkPagamentoCancelado($order_id,$tipo_pagamento, $statusPagamento = 7){

    $tabela = Type_PagamentoTabela::getNickFromValue($tipo_pagamento);
    $row =   $this->db->query("SELECT `status_pagamento` FROM ".$tabela." WHERE `order_id` = " . (int) $order_id . " and status_pagamento = " . (int) $statusPagamento . "  limit 1")->row;

    if(isset($row['status_pagamento'])) {
        return true;
    } else {
        return false;
    }

}


public function checkCreditoAguardandoCaptura($order_id, $status_retorno){
  $sql = "SELECT status_retorno FROM `oc_payment_credit_card` WHERE order_id = " . (int) $order_id . " ORDER BY 1 DESC LIMIT 1";

  $row = $this->db->query($sql)->row;

  if(isset($row['status_retorno']) && $row['status_retorno'] == $status_retorno) {
      return 1;
  } else {
      return 0;
  }

}


  public function getOrderByToken($data = array())
  {
    $sql  = "SELECT o.order_id FROM oc_order o LEFT JOIN oc_payment_credit_card pcc ON (o.order_id = pcc.order_id)";

    $where = array();
    if (isset($data['codigo_integracao_pagamento'])) {
      $where[] = " o.codigo_integracao_pagamento = '" . $this->db->escape($data['codigo_integracao_pagamento']) . "'";
    }

    if (isset($data['tid'])) {
      $where[] = " pcc.tid = '" . $this->db->escape($data['tid']) . "'";
    }

    if (isset($data['payment_code'])) {
      $where[] = " o.payment_code = '" . $this->db->escape($data['payment_code']) . "'";
    }

    if($where){
      $sql.= 'where '.implode( 'and', $where);
    }

    $query = $this->db->query($sql);
    return ($query->rows) ? $query->row : false;
  }

  public function addPaymentAntiFraude($fraudeResult){
    $this->load->helper('Ftr_sql');
    $this->load->type('tipocomum');
    try{
      $fieldList = array();
      $fields = array();

      $fieldList = array('order_id','antifraud_method','fraud_analysis_id','status',
          'reason_code','address_info_code','factor_code','score','bin_country',
          'card_issuer','card_scheme','host_severity','internet_info_code','ip_routing_method',
          'score_model_used','case_priority','provider_transaction_id','recommendation','risk_level','tds_code','tds_message',
          'hot_list_info_code','identity_info_code','ip_city','ip_country','ip_state','velocity_infocode');

      $fields[]= (int)$fraudeResult['order_id'];
      $fields[]= (int)$fraudeResult['antifraud_method'];
      $fields[]= isset($fraudeResult['fraud_analysis_id']) ? $fraudeResult['fraud_analysis_id'] : null;
      $fields[]= isset($fraudeResult['status']) ? (int)$fraudeResult['status'] : null;
      $fields[]= isset($fraudeResult['reason_code']) ? (int)$fraudeResult['reason_code'] : null;
      $fields[]= isset($fraudeResult['address_info_code']) ? $fraudeResult['address_info_code'] : null;
      $fields[]= isset($fraudeResult['factor_code']) ? $fraudeResult['factor_code'] : null;
      $fields[]= isset($fraudeResult['score']) ? (int)$fraudeResult['score'] : null;
      $fields[]= isset($fraudeResult['bin_country']) ? $fraudeResult['bin_country'] : null;
      $fields[]= isset($fraudeResult['card_issuer']) ? $fraudeResult['card_issuer'] : null;
      $fields[]= isset($fraudeResult['card_scheme']) ? $fraudeResult['card_scheme']: null;
      $fields[]= isset($fraudeResult['host_severity']) ? (int)$fraudeResult['host_severity']: null;
      $fields[]= isset($fraudeResult['internet_info_code']) ? $fraudeResult['internet_info_code']: null;
      $fields[]= isset($fraudeResult['ip_routing_method']) ? $fraudeResult['ip_routing_method']: null;
      $fields[]= isset($fraudeResult['score_model_used']) ? $fraudeResult['score_model_used']: null;
      $fields[]= isset($fraudeResult['case_priority']) ? (int)$fraudeResult['case_priority']: null;
      $fields[]= isset($fraudeResult['provider_transaction_id']) ? $fraudeResult['provider_transaction_id']: null;
      $fields[]= isset($fraudeResult['recommendation']) ? $fraudeResult['recommendation']: null;
      $fields[]= isset($fraudeResult['risk_level']) ? $fraudeResult['risk_level']: null;
      $fields[]= isset($fraudeResult['tds_code']) ? $fraudeResult['tds_code']: null;
      $fields[]= isset($fraudeResult['tds_message']) ? $fraudeResult['tds_message']: null;
      $fields[]= isset($fraudeResult['hot_list_info_code']) ? $fraudeResult['hot_list_info_code']: null;
      $fields[]= isset($fraudeResult['identity_info_code']) ? $fraudeResult['identity_info_code']: null;
      $fields[]= isset($fraudeResult['ip_city']) ? $fraudeResult['ip_city']: null;
      $fields[]= isset($fraudeResult['ip_country']) ? $fraudeResult['ip_country']: null;
      $fields[]= isset($fraudeResult['ip_state']) ? $fraudeResult['ip_state']: null;
      $fields[]= isset($fraudeResult['velocity_infocode']) ? $fraudeResult['velocity_infocode']: null;

      $sqlInsert = Ftr_sql::generateInsert('oc_antifraud_details',$fieldList);
      $this->db->executeSql($sqlInsert, $fields);

      $sqlUpdParam = Ftr_sql::generateUpdate('oc_order', ['antifraude_verificado'], 'order_id = '.$fraudeResult['order_id']);
      $this->db->executeSql($sqlUpdParam, [$fraudeResult['antifraud_method']]);

    }catch (Exception $e){
      throw new exception('Erro ao inserir registros referente ao anti fraude.'.$e->getMessage());
    }
  }

  public function updatePaymentAntiFraude($data)
  {
    $this->load->helper('Ftr_sql');
    $fieldList = array();
    $fieldValues = array();

    foreach ($data as $key => $value){
      if ($key != 'order_id'){
        $fieldList[] = $key;
        $fieldValues[] = $value;
      }
    }

    $sqlUpdate = Ftr_sql::generateUpdate('oc_antifraud_details', $fieldList , 'order_id = '.$data['order_id'] );
    $this->db->executeSql($sqlUpdate, $fieldValues);
  }

  public function getPaymentInfoCreditCard($order_id,$paymentCode=false){
    switch ($paymentCode){
      case 'rede_credito' :
        $sql = 'SELECT
                  cartao_mascarado AS cartao_mascara,
                  parcelas AS qtd_parcela,
                  retorno_codigo,
                  retorno_mensagem,
                  tid,
                  total_pedido,
                  status_captura
                FROM oc_rede_order
                where pedido_id='.$order_id
                .' ORDER BY rede_order_id DESC LIMIT 1';
      break;
      case 'cielo_api_credito' :
        $sql = 'SELECT
                pagamento_numCartao AS cartao_mascara,
                pagamento_parcelas AS qtd_parcela,
                cod_retorno as retorno_codigo,
                msg_retorno as retorno_mensagem,
                tid,
                pedido_valor as total_pedido,
                pagamento_id,
                status_captura,
                pagamento_tipo,
                pagamento_bandeira
              FROM oc_cielo_30_order
              where pedido_id='.$order_id
              .' ORDER BY cielo_30_order_id DESC LIMIT 1';
      break;
      default :
        $sql = 'SELECT
              cartao_mascara,
              qtd_parcela,
              mensagem_retorno as retorno_mensagem,
              tid,
              valor_pagamento as total_pedido
              FROM oc_payment_credit_card
              where order_id='.$order_id
              .' ORDER BY payment_credit_card_id DESC LIMIT 1';
      break;
    }
    $query = $this->db->query($sql);
    return ($query->rows) ? $query->row : false;
  }

  public function getBandeira($payment_method, $tipo_bandeira){
    switch($payment_method){
      case 'wirecard' :
        $this->load->type('tipowirecard');
        $bandeira = Type_FormPgtowirecardCartao::getNickFromConstValue($tipo_bandeira);
      break;
      case 'yapay' :
        $this->load->type('tipoyapay');
        $bandeira = Type_FormPgtoYapayCartao::getNickFromConstValue($tipo_bandeira);
      break;
      case 'cielo_api_credito' :
        $this->load->type('tipocieloapi');
        $bandeira = Type_CieloApiBandeira::getNickFromConstValue($tipo_bandeira);
      break;
      case 'rede_credito' :
        $this->load->type('tiporede');
        $bandeira = Type_RedeBandeira::getNickFromConstValue($tipo_bandeira);
      break;
      case 'pagseguro_api' :
        $this->load->type('tipopagseguro');
        $bandeira = Type_PagseguroBandeira::getNickFromConstValue($tipo_bandeira);
      break;
      case 'getnet' :
        $this->load->type('tipogetnet');
        $bandeira = Type_GetnetBandeira::getNickFromConstValue($tipo_bandeira);
      break;
      case 'pagarme' :
        $this->load->type('tipopagarme');
        $bandeira = Type_PagarmeBandeira::getNickFromConstValue($tipo_bandeira);
      break;
      default : $bandeira = '';
    }
    return $bandeira;
  }

}