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

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

// SOMENTE MOCK: sem worker, rede, certificado real ou XML fiscal válido.
final class DocumentationRecoveryMockEngine implements Engine
{
    public int $calls = 0;

    public function execute(#[SensitiveParameter] array $request, ?callable $cancelled = null): FiscalResult
    {
        if (($request['comando'] ?? null) !== 'recuperarXml'
            || ($request['config']['ambiente'] ?? null) !== 2
            || base64_decode($request['xmlBase64'] ?? '', true) !== '<NFe>XML SINTETICO LOCAL SEM VALOR FISCAL</NFe>') {
            throw new RuntimeException('Requisicao mock inesperada.');
        }
        ++$this->calls;
        return new FiscalResult([
            'sucesso' => true,
            'estado' => 'XML_RECUPERADO',
            'cStat' => 100,
            'chave' => str_repeat('1', 44),
            'protocolo' => str_repeat('2', 15),
            'xmlBase64' => base64_encode('<nfeProc>RESPOSTA MOCK SEM VALOR FISCAL</nfeProc>'),
            'envioIniciado' => false,
            'retornoWebServiceOriginalDisponivel' => false,
        ]);
    }
}

$emitter = null;
$exitCode = 0;
try {
    // Bytes opacos exclusivos da Engine mock; não são um PFX válido.
    $certificate = CertificateA1::fromData('MOCK_PFX_NOT_A_REAL_CERTIFICATE', 'MOCK_PASSWORD');
    $engine = new DocumentationRecoveryMockEngine();
    $emitter = new Emitter(
        new Configuration('11222333000181', 'CE', modelo: 55, ambiente: 2, certificado: $certificate),
        engine: $engine,
    );
    $result = $emitter->recuperarXml('<NFe>XML SINTETICO LOCAL SEM VALOR FISCAL</NFe>');
    if ($engine->calls !== 1 || $result->statusEnvio() !== 'autorizado'
        || $result->xml() !== '<nfeProc>RESPOSTA MOCK SEM VALOR FISCAL</nfeProc>') {
        throw new RuntimeException('Resultado mock inesperado.');
    }
    $original = $result->retornoOriginal(); // Acesso explícito; não imprimir o payload.
    if (($original['origem'] ?? null) !== 'frame_nativo') {
        throw new RuntimeException('Origem inesperada.');
    }
    acbrExamplePrint(['simulado' => true, 'resultado' => $result->jsonSerialize()]);
} catch (Throwable $error) {
    acbrExampleError($error);
    $exitCode = 1;
} finally {
    $emitter?->fechar();
}
exit($exitCode);
