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

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

// Demonstra composição da aplicação em memória. Não é armazenamento durável.
final class RecoveryDocumentationMock implements Engine
{
    public int $transmissions = 0;
    public int $queries = 0;

    public function execute(#[SensitiveParameter] array $request, ?callable $cancelled = null): FiscalResult
    {
        if (($request['config']['ambiente'] ?? null) !== 2) {
            throw new RuntimeException('Os exemplos exigem HOMOLOGACAO.');
        }
        if ($request['comando'] === 'transmitir') {
            ++$this->transmissions;
            throw new AcbrException('TIMEOUT_MOTOR', 'Timeout simulado local.', true, true, $request['xmlBase64']);
        }
        if ($request['comando'] !== 'consultar') {
            throw new RuntimeException('Operacao fora do exemplo.');
        }
        ++$this->queries;
        return new FiscalResult([
            'sucesso' => true, 'estado' => 'AUTORIZADO', 'cStat' => 100,
            'chave' => str_repeat('1', 44), 'protocolo' => str_repeat('2', 15),
        ]);
    }
}

$emitter = null;
$exitCode = 0;
try {
    $engine = new RecoveryDocumentationMock();
    $emitter = new Emitter(
        new Configuration(
            '11222333000181', 'CE', modelo: 55, ambiente: 2,
            certificado: CertificateA1::fromData('MOCK_NOT_A_PFX', 'MOCK_PASSWORD'),
        ),
        engine: $engine,
    );
    $original = '<NFe>XML SINTETICO SOMENTE PARA MOCK LOCAL</NFe>';
    $intent = ['ambiente' => 2, 'status' => 'em_execucao', 'chave' => str_repeat('1', 44)];
    try {
        $result = $emitter->transmitir($original);
        $intent['status'] = $result->statusEnvio();
    } catch (AcbrException $error) {
        $intent['status'] = $error->resultadoDesconhecido ? 'resultado_incerto' : 'nao_enviado';
        $recoveredOriginal = $error->xmlRecuperacao(); // XML original, não baixado da SEFAZ.
        if (!$error->resultadoDesconhecido || !$error->limpezaConfirmada || $recoveredOriginal !== $original) {
            throw new RuntimeException('Sinalizacao simulada inesperada.');
        }
        acbrExamplePrint(['simulado' => true, 'erro' => $error->jsonSerialize(), 'xmlOriginalPreservado' => true]);
    }
    if ($intent['status'] === 'resultado_incerto') {
        $query = $emitter->consultar(['chave' => $intent['chave']]);
        $data = $query->data(); // Acesso explícito privado para correlação.
        if ($query->statusEnvio() === 'autorizado' && ($data['chave'] ?? null) === $intent['chave']) {
            $intent['status'] = 'autorizado';
        }
    }
    if ($engine->transmissions !== 1 || $engine->queries !== 1 || $intent['status'] !== 'autorizado') {
        throw new RuntimeException('Recuperacao simulada inesperada.');
    }
    acbrExamplePrint(['simulado' => true, 'statusFinal' => $intent['status'], 'transmissoes' => 1, 'consultas' => 1, 'retryAutomatico' => false]);
} catch (Throwable $error) {
    acbrExampleError($error);
    $exitCode = 1;
} finally {
    $emitter?->fechar();
}
exit($exitCode);
