<?php
require_once __DIR__ . '/../bootstrap.php';

use Gestoreasy\Core\Tenant\TenantAdmin;
use Gestoreasy\Core\Tenant\ConnectionManager;
use Gestoreasy\Core\Fiscal\VersionRouter;
use Gestoreasy\Core\Fiscal\TaxConfig;

function assertTrue($cond, $msg) { if (!$cond) { echo "FAIL: $msg\n"; exit(1); } }

$tenant = 'default';
TenantAdmin::runMigrations($tenant);
$pdo = ConnectionManager::forTenant($tenant);

$items = [ ['descricao' => 'Item teste', 'quantidade' => 1, 'preco' => 100] ];

// Garantir versão atual padrão 2024
$cfg0 = TaxConfig::get($pdo);
assertTrue(($cfg0['model_version'] ?? '') !== '', 'TaxConfig get retorna versão');

// 1) Preview forçado 2024
$r24 = VersionRouter::previewNfce($items, '2024');
assertTrue(is_array($r24), 'previewNfce 2024 deve retornar array');
assertTrue(isset($r24['model_version']) && $r24['model_version'] === '2024', 'resultado legado inclui model_version=2024');
assertTrue(isset($r24['totals']) && isset($r24['environment']), 'resultado legado deve conter totals e environment');

// 2) Preview forçado 2026
$r26 = VersionRouter::previewNfce($items, '2026');
assertTrue(is_array($r26), 'previewNfce 2026 deve retornar array');
assertTrue(isset($r26['total']) && isset($r26['ibs_total']) && isset($r26['cbs_total']), 'resultado 2026 deve conter totais IBS/CBS');
assertTrue(isset($r26['model_version']) && $r26['model_version'] === '2026', 'resultado 2026 inclui model_version=2026');

// 3) Validação cruzada produz ambas visões
$cross = VersionRouter::crossValidatePreview($items);
assertTrue(isset($cross['legacy']) && isset($cross['next']), 'crossValidatePreview deve conter legacy e next');
assertTrue(isset($cross['legacy']['environment']), 'legacy deve conter environment');
assertTrue(isset($cross['legacy']['model_version']) && $cross['legacy']['model_version'] === '2024', 'legacy model_version=2024');
assertTrue(isset($cross['next']['model_version']) && $cross['next']['model_version'] === '2026', 'next model_version=2026');

echo "PASS: VersionRouterTest (preview 2024/2026, cross validate).\n";