<?php
class Nfs{

  private $opts = false;

  private $fingeral_registro = false;
  private $id_nf = false;
  private $aliquota_dds = false;
  private $cliente = false;
  private $servico = false;

  public function __construct(){
    global $bd;
    $this->bd = $bd;
    include_once(__DIR__.'/../../../scripts/financeiro/functions_fingeral.php');
  }

  public function fingeralRegistro($id, $opts=array()){
    $sql = $this->bd->getConexao()->prepare('
      SELECT
        r.*,
        f.valor_pago
      FROM fingeral_registros r
        LEFT JOIN clubes_financeiro f ON f.id = r.id_clube_financeiro
      WHERE r.id = :id');
    $sql->bindValue(':id', $id, PDO::PARAM_STR);
    if($sql->execute()){$this->fingeral_registro = $sql->fetch(PDO::FETCH_ASSOC);}

    if($this->fingeral_registro['id_nfs']>0){
      $this->id_nf = $this->fingeral_registro['id_nfs'];
    }

    $this->opts = $opts;
  }

  // Cria o registro da NF (e inicia processo de envio)
  public function cadastrar(){
    if($this->fingeral_registro && $this->fingeral_registro['id_nfs']==0){

      $ref = 'fid'.$this->fingeral_registro['id'].'cd'.gerarSenha(10);

      $sql = $this->bd->getConexao()->prepare('INSERT INTO fingeral_nfs
      (ref, data_hora, status) VALUES
      (:ref, NOW(), 0)');
      $sql->bindValue(':ref', $ref, PDO::PARAM_STR);
      if($sql->execute());

      $this->id_nf = $this->bd->lastId();

      $sql = $this->bd->getConexao()->prepare('UPDATE fingeral_registros SET id_nfs = :id_nfs WHERE id = :id');
      $sql->bindValue(':id', $this->fingeral_registro['id'], PDO::PARAM_STR);
      $sql->bindValue(':id_nfs', $this->id_nf, PDO::PARAM_STR);
      if($sql->execute());

      $this->enviar();
    }
  }

  // Envia nova para emissão
  public function enviar(){
    if($this->id_nf){
      $this->nf = sel_fingeral("nfs_dds", array('id'=>$this->id_nf));
      $this->aliquota();
      if($this->aliquota_dds){
        // Cliente (tomador) para NF
        $this->ddsCliente();

        // Dados do serviço
        $this->ddsServico();

        // Altera valor se "valor_force" existir
        if(isset($this->opts['valor_force'])){
          $this->servico['valor_total'] = $this->opts['valor_force'];
        }

        // Envia a NF para emissão
        if($this->cliente && $this->servico){ // condicionar somente à pessoa física, enquanto não houver solução por parte da prefeitura de foz
          include_once(__DIR__.'/NFsFocus.php');
          $send = new NFsFocus($this->nf, $this->cliente, $this->servico, $this->aliquota_dds);
          // Atualiza status do registro da NF
          if($send->response && isset($send->response['status']) && $send->response['status']=="processando_autorizacao"){
            $sql = $this->bd->getConexao()->prepare('UPDATE fingeral_nfs SET
            rps_numero = :rps_numero,
            rps_serie = :rps_serie,
            rps_tipo = :rps_tipo,
            aliquota_id = :aliquota_id,
            data_hora_envio = NOW(),
            status = 1,
            erro = 0
            WHERE id = :id');
            $sql->bindValue(':id', $this->id_nf, PDO::PARAM_STR);
            $sql->bindValue(':rps_numero', $send->response['numero_rps'], PDO::PARAM_STR);
            $sql->bindValue(':rps_serie', $send->response['serie_rps'], PDO::PARAM_STR);
            $sql->bindValue(':rps_tipo', $send->response['tipo_rps'], PDO::PARAM_STR);
            $sql->bindValue(':aliquota_id', $this->aliquota_dds['id'], PDO::PARAM_STR);
            if( $sql->execute() );
          }else{
            echoPre($send->response);
          }
        }
      }
    }
  }

  // Atualiza status do registro da NF
  public function atualizarStatus($dds){

    // NOTA EMITIDA
    if($dds['status']==2){
      $sql = $this->bd->getConexao()->prepare('UPDATE fingeral_nfs SET
        nf_numero = :nf_numero,
        nf_cod_verificacao = :nf_cod_verificacao,
        nf_url = :nf_url,
        nf_pdf = :nf_pdf,
        data_hora_emissao = :data_hora_emissao,
        status = 2
        WHERE ref = :ref AND status = 1');
      $sql->bindValue(':ref', $dds['ref'], PDO::PARAM_STR);
      $sql->bindValue(':nf_numero', $dds['nf_numero'], PDO::PARAM_STR);
      $sql->bindValue(':nf_cod_verificacao', $dds['nf_cod_verificacao'], PDO::PARAM_STR);
      $sql->bindValue(':nf_url', $dds['nf_url'], PDO::PARAM_STR);
      $sql->bindValue(':nf_pdf', $dds['nf_pdf'], PDO::PARAM_STR);
      $sql->bindValue(':data_hora_emissao', $dds['data_hora_emissao'], PDO::PARAM_STR);
      if( $sql->execute() );

    }

    // NOTA EMITIDA
    elseif($dds['erro']==1){
      $sql = $this->bd->getConexao()->prepare('UPDATE fingeral_nfs SET
        erro = 1,
        erro_json = :erro_json
        WHERE ref = :ref AND status = 1');
      $sql->bindValue(':ref', $dds['ref'], PDO::PARAM_STR);
      $sql->bindValue(':erro_json', $dds['erro_json'], PDO::PARAM_STR);
      if( $sql->execute() );
    }



  }


  // FUNÇÕES PARA GET DE INFORMAÇÕES

  // Aliquota
  public function aliquota(){
    $aliquota_dds = sel_fingeral("nfs_aliquota");
    if($aliquota_dds){
      $this->aliquota_dds = $aliquota_dds;
    }
  }

  // Dados do cliente (tomador)
  private function ddsCliente(){
    include_once(__DIR__.'/NFsCliente.php');
    // Clube
    if($this->fingeral_registro['id_clube']>0){
      $cliente = new NFsCliente("clube", $this->fingeral_registro['id_clube']);
    }
    // Stripe
    if(isset($this->opts['stripe'])){
      $cliente = new NFsCliente("stripe");
    }
    $this->cliente = isset($cliente) ? $cliente : false;
  }

  // Dados do serviço
  private function ddsServico(){

    $periodo = meses(str_pad($this->fingeral_registro['periodo_mes'], 2, '0', STR_PAD_LEFT)).'/20'.$this->fingeral_registro['periodo_ano'];

    switch($this->fingeral_registro['id_categoria']) {
      case '63':
        $descricao = 'Licença de uso - '.$periodo; break;
      case '118':
        $descricao = 'Licença de uso (torneios extras) - '.$periodo; break;
      default:
        $descricao = 'Licença de uso';
    }

    $this->servico = array(
      "descricao"=>$descricao,
      "valor_total"=> ($this->fingeral_registro['id_clube_financeiro']>0 && $this->fingeral_registro['valor_pago']>0) ? $this->fingeral_registro['valor_pago'] : $this->fingeral_registro['valor'],
      "cod_cnae"=>"6319400",
      "cod_servico"=>"0109",
    );
  }

}