<?php
declare(strict_types=1);
require __DIR__ . '/bootstrap.php';

use Acbr\CertificateA1;
use Acbr\Configuration;
use Acbr\Emitter;
use Acbr\Engine;
use Acbr\FiscalResult;

// SIMULAÇÃO LOCAL: nenhum worker, certificado real ou endpoint de rede é usado.
final class DocumentationMockEngine implements Engine
{
    public int $calls = 0;

    public function execute(#[SensitiveParameter] array $request, ?callable $cancelled = null): FiscalResult
    {
        if (($request['config']['ambiente'] ?? null) !== 2) {
            throw new RuntimeException('Os exemplos exigem HOMOLOGACAO.');
        }
        ++$this->calls;
        $command = $request['comando'];
        $states = [
            'gerarXml' => 'XML_GERADO', 'validar' => 'VALIDADO', 'assinar' => 'ASSINADO',
            'transmitir' => 'AUTORIZADO', 'consultar' => 'AUTORIZADO', 'cancelar' => 'CANCELADO',
            'cartaCorrecao' => 'EVENTO_REGISTRADO', 'inutilizar' => 'INUTILIZADO',
        ];
        $data = ['sucesso' => true, 'estado' => $states[$command]];
        if (in_array($command, ['gerarXml', 'validar', 'assinar'], true)) {
            $data['xmlBase64'] = base64_encode('<NFe>EXEMPLO SINTETICO LOCAL SEM VALOR FISCAL</NFe>');
        } else {
            $data += [
                'cStat' => match ($command) { 'cancelar', 'cartaCorrecao' => 135, 'inutilizar' => 102, default => 100 },
                'envioIniciado' => true,
                'chave' => str_repeat('1', 44),
                'protocolo' => str_repeat('2', 15),
            ];
        }
        return new FiscalResult($data);
    }
}

$emitter = null;
$exitCode = 0;
try {
    // Bytes opacos são aceitos só pela Engine mock; isto não é um PFX válido.
    $certificate = CertificateA1::fromData('MOCK_PFX_NOT_A_REAL_CERTIFICATE', 'MOCK_PASSWORD');
    $engine = new DocumentationMockEngine();
    $emitter = new Emitter(
        new Configuration('11222333000181', 'CE', modelo: 55, ambiente: 2, certificado: $certificate),
        engine: $engine,
    );
    $xml = '<NFe>EXEMPLO SINTETICO LOCAL SEM VALOR FISCAL</NFe>';
    $key = str_repeat('1', 44);
    $protocol = str_repeat('2', 15);
    $reason = 'JUSTIFICATIVA SINTETICA DE TESTE LOCAL';
    $results = [
        $emitter->gerarXml(acbrExampleDocument()),
        $emitter->validar($xml),
        $emitter->assinar($xml),
        $emitter->transmitir($xml),
        $emitter->consultar(['chave' => $key, 'recibo' => $protocol]),
        $emitter->cancelar(['chave' => $key, 'protocolo' => $protocol, 'justificativa' => $reason]),
        $emitter->cartaCorrecao(['chave' => $key, 'correcao' => 'CORRECAO SINTETICA PARA TESTE LOCAL', 'sequenciaEvento' => 1]),
        $emitter->inutilizar(['ano' => 26, 'serie' => 1, 'numeroInicial' => 1, 'numeroFinal' => 2, 'justificativa' => $reason]),
    ];
    foreach ($results as $index => $result) {
        $expected = $index < 3 ? 'nao_enviado' : 'autorizado';
        if ($result->statusEnvio() !== $expected) {
            throw new RuntimeException('Classificacao simulada inesperada.');
        }
        acbrExamplePrint(['simulado' => true, 'comando' => $result->comando(), 'resultado' => $result->jsonSerialize()]);
    }
    if ($engine->calls !== 8) {
        throw new RuntimeException('Numero inesperado de chamadas simuladas.');
    }
} catch (Throwable $error) {
    acbrExampleError($error);
    $exitCode = 1;
} finally {
    $emitter?->fechar();
}
exit($exitCode);
