<?php
namespace Gestoreasy\Core\Fiscal;

use Gestoreasy\Core\Http\Request;
use Gestoreasy\Core\Tenant\ConnectionManager;
use Gestoreasy\Core\Tenant\TenantContext;

class CteService {
    
    /**
     * Emite CT-e (mock para homologação)
     */
    public static function authorizeMock(Request $r, array $cteData): array {
        $environment = (string)($cteData['environment'] ?? 'homolog');
        $remetenteCnpj = preg_replace('/\D/', '', (string)($cteData['remetente_cnpj'] ?? ''));
        $destinatarioDoc = preg_replace('/\D/', '', (string)($cteData['destinatario_cnpj'] ?? $cteData['destinatario_cpf'] ?? ''));
        
        // Validações básicas
        if (strlen($remetenteCnpj) !== 14) {
            return [
                'status' => 'error',
                'environment' => $environment,
                'messages' => ['CNPJ do remetente inválido']
            ];
        }
        
        if (empty($destinatarioDoc) || (strlen($destinatarioDoc) !== 14 && strlen($destinatarioDoc) !== 11)) {
            return [
                'status' => 'error', 
                'environment' => $environment,
                'messages' => ['Documento do destinatário inválido (deve ser CNPJ ou CPF)']
            ];
        }
        
        $vlTotal = (float)($cteData['vl_total'] ?? 0);
        if ($vlTotal <= 0) {
            return [
                'status' => 'error',
                'environment' => $environment, 
                'messages' => ['Valor total deve ser maior que zero']
            ];
        }
        
        // Gerar chave mock (44 dígitos)
        $uf = '33'; // RJ para mock
        $aamm = date('ym');
        $cnpj = $remetenteCnpj;
        $mod = '57'; // CT-e
        $serie = str_pad((string)($cteData['serie'] ?? 1), 3, '0', STR_PAD_LEFT);
        $numero = str_pad((string)($cteData['numero'] ?? rand(1, 999999)), 9, '0', STR_PAD_LEFT);
        $tpEmis = '1'; // Normal
        $codigo = str_pad((string)rand(10000000, 99999999), 8, '0', STR_PAD_LEFT);
        
        $chaveBase = $uf . $aamm . $cnpj . $mod . $serie . $numero . $tpEmis . $codigo;
        $dv = self::calculateDV($chaveBase);
        $chave = $chaveBase . $dv;
        
        // Mock de autorização
        $protocolo = 'CTE' . date('YmdHis') . rand(1000, 9999);
        
        // XML mock simplificado
        $xml = self::generateMockXml($chave, $protocolo, $cteData);
        
        return [
            'status' => 'authorized',
            'chave' => $chave,
            'protocolo' => $protocolo,
            'xml' => $xml,
            'environment' => $environment,
            'messages' => [
                'CT-e autorizado com sucesso (MOCK)',
                "Chave: $chave",
                "Protocolo: $protocolo"
            ]
        ];
    }
    
    /**
     * Cancela CT-e (mock)
     */
    public static function cancelMock(string $chave, string $justificativa): array {
        if (strlen($chave) !== 44) {
            return [
                'status' => 'error',
                'messages' => ['Chave de acesso inválida']
            ];
        }
        
        if (strlen($justificativa) < 15) {
            return [
                'status' => 'error', 
                'messages' => ['Justificativa deve ter pelo menos 15 caracteres']
            ];
        }
        
        $protocolo = 'CAN' . date('YmdHis') . rand(1000, 9999);
        
        return [
            'status' => 'canceled',
            'chave' => $chave,
            'protocolo' => $protocolo,
            'messages' => [
                'CT-e cancelado com sucesso (MOCK)',
                "Justificativa: $justificativa",
                "Protocolo: $protocolo"
            ]
        ];
    }
    
    /**
     * Consulta status do CT-e (mock)
     */
    public static function consultMock(string $chave): array {
        if (strlen($chave) !== 44) {
            return [
                'status' => 'error',
                'messages' => ['Chave de acesso inválida']
            ];
        }
        
        // Mock: simula consulta na SEFAZ
        $statuses = ['authorized', 'canceled', 'rejected'];
        $status = $statuses[array_rand($statuses)];
        
        return [
            'status' => $status,
            'chave' => $chave,
            'protocolo' => 'CON' . date('YmdHis') . rand(1000, 9999),
            'messages' => [
                "Status atual: $status (MOCK)",
                'Consulta realizada com sucesso'
            ]
        ];
    }
    
    /**
     * Calcula dígito verificador da chave
     */
    private static function calculateDV(string $chave): string {
        $sequence = '4329876543298765432987654329876543298765432';
        $sum = 0;
        
        for ($i = 0; $i < 43; $i++) {
            $sum += (int)$chave[$i] * (int)$sequence[$i];
        }
        
        $remainder = $sum % 11;
        $dv = $remainder < 2 ? 0 : 11 - $remainder;
        
        return (string)$dv;
    }
    
    /**
     * Gera XML mock do CT-e
     */
    private static function generateMockXml(string $chave, string $protocolo, array $data): string {
        $dhEmi = date('c');
        $numero = str_pad((string)($data['numero'] ?? 1), 9, '0', STR_PAD_LEFT);
        $serie = (string)($data['serie'] ?? 1);
        
        return <<<XML
<?xml version="1.0" encoding="UTF-8"?>
<cteProc xmlns="http://www.portalfiscal.inf.br/cte" versao="3.00">
  <CTe xmlns="http://www.portalfiscal.inf.br/cte">
    <infCte Id="CTe{$chave}">
      <ide>
        <cUF>33</cUF>
        <cCT>{$numero}</cCT>
        <CFOP>5353</CFOP>
        <natOp>Transporte</natOp>
        <mod>57</mod>
        <serie>{$serie}</serie>
        <nCT>{$numero}</nCT>
        <dhEmi>{$dhEmi}</dhEmi>
        <tpImp>1</tpImp>
        <tpEmis>1</tpEmis>
        <cDV>{$chave[43]}</cDV>
        <tpAmb>2</tpAmb>
        <tpCTe>0</tpCTe>
        <procEmi>0</procEmi>
        <verProc>1.0</verProc>
        <cMunEnv>3304557</cMunEnv>
        <xMunEnv>Rio de Janeiro</xMunEnv>
        <UFEnv>RJ</UFEnv>
        <modal>01</modal>
        <tpServ>0</tpServ>
        <cMunIni>3304557</cMunIni>
        <xMunIni>Rio de Janeiro</xMunIni>
        <UFIni>RJ</UFIni>
        <cMunFim>3304557</cMunFim>
        <xMunFim>Rio de Janeiro</xMunFim>
        <UFFim>RJ</UFFim>
        <retira>0</retira>
        <indIEToma>1</indIEToma>
      </ide>
      <emit>
        <CNPJ>{$data['remetente_cnpj']}</CNPJ>
        <IE>{$data['remetente_ie']}</IE>
        <xNome>{$data['remetente_nome']}</xNome>
      </emit>
      <rem>
        <CNPJ>{$data['remetente_cnpj']}</CNPJ>
        <IE>{$data['remetente_ie']}</IE>
        <xNome>{$data['remetente_nome']}</xNome>
      </rem>
      <dest>
        <CNPJ>{$data['destinatario_cnpj']}</CNPJ>
        <xNome>{$data['destinatario_nome']}</xNome>
      </dest>
      <vPrest>
        <vTPrest>{$data['vl_total']}</vTPrest>
        <vRec>{$data['vl_receber']}</vRec>
      </vPrest>
      <imp>
        <ICMS>
          <ICMS00>
            <CST>00</CST>
            <vBC>{$data['vl_total']}</vBC>
            <pICMS>12.00</pICMS>
            <vICMS>{$data['vl_icms']}</vICMS>
          </ICMS00>
        </ICMS>
      </imp>
      <infCarga>
        <vCarga>{$data['vl_total']}</vCarga>
        <proPred>{$data['produto_predominante']}</proPred>
      </infCarga>
    </infCte>
  </CTe>
  <protCTe versao="3.00">
    <infProt>
      <tpAmb>2</tpAmb>
      <verAplic>RS20200904164655</verAplic>
      <chCTe>{$chave}</chCTe>
      <dhRecbto>{$dhEmi}</dhRecbto>
      <nProt>{$protocolo}</nProt>
      <digVal>mock</digVal>
      <cStat>100</cStat>
      <xMotivo>Autorizado o uso do CT-e</xMotivo>
    </infProt>
  </protCTe>
</cteProc>
XML;
    }
}