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

use Gestoreasy\Core\Tenant\TenantAdmin;
use Gestoreasy\Core\Tenant\ConnectionManager;
use Gestoreasy\Core\Fiscal\Sped\SpedFiscalGenerator;
use Gestoreasy\Core\Fiscal\Sped\Period as SpedPeriod;
use Gestoreasy\Core\Fiscal\Sped\Validation\SpedValidator;
use Gestoreasy\Core\Fiscal\TaxConfig;

function assertTrue($c,$m){ if(!$c){ echo "FAIL: $m\n"; exit(1);} }
function assertContainsIssue(array $issues, string $needle, string $msg){
  foreach ($issues as $i){ if (str_contains($i, $needle)) { echo "$msg\n"; return; } }
  echo "FAIL: issue não encontrada: $needle\n"; exit(1);
}

$tenant = $argv[1] ?? 'default';
TenantAdmin::runMigrations($tenant);
$pdo = ConnectionManager::forTenant($tenant);

// Seed empresa e dois produtos com NCM distintos
$pdo->exec("INSERT INTO empresas (nome, razao_social, cnpj, ie, email, telefone, estado, cep, logradouro, numero, bairro, cidade, created_at)
    SELECT 'Empresa Inferior', 'Empresa Inferior Ltda', '33.444.555/0001-77', '192837465', 'contato@inferior.com', '(21)9888-7777', 'RJ', '33333333', 'Rua Inferior', '300', 'Centro', 'Rio de Janeiro', NOW()
    WHERE NOT EXISTS (SELECT 1 FROM empresas)");
$pdo->exec("INSERT INTO products (codigo, descricao, ean, unidade, ncm) VALUES ('SKU-ALIQ-12-INF','Produto Aliq 12 INF','3111111111111','UN','00001234')");
$pdo->exec("INSERT INTO products (codigo, descricao, ean, unidade, ncm) VALUES ('SKU-ALIQ-18-INF','Produto Aliq 18 INF','3222222222222','UN','99991234')");
$pdo->exec("INSERT INTO clients (nome, cnpj) VALUES ('Cliente Inferior','88.999.000/0001-22')");

// Definir regras de ICMS por NCM/UF/operação (saída RJ): 12% para prefixo 0000, 18% para 9999
TaxConfig::save($pdo, '2024', null, 'production', [
  'tax_rules' => [
    ['type' => 'icms', 'ncm_prefix' => '0000', 'uf' => 'RJ', 'op' => 'saida', 'icms' => 0.12],
    ['type' => 'icms', 'ncm_prefix' => '9999', 'uf' => 'RJ', 'op' => 'saida', 'icms' => 0.18],
  ]
]);

// Pedido de venda com dois itens: primeiro 18%, depois 12% (para que C190 use 18 como alíquota consolidada)
$pdo->exec("INSERT INTO sales_orders (numero, cliente_id, valor_total, status, created_at)
    VALUES ('SO-INFERIOR-ALIQ', (SELECT id FROM clients ORDER BY id DESC LIMIT 1), 300.00, 'aberto', NOW())");
$orderId = (int)$pdo->query("SELECT id FROM sales_orders WHERE numero='SO-INFERIOR-ALIQ'")->fetch()['id'];
$p12 = (int)$pdo->query("SELECT id FROM products WHERE codigo='SKU-ALIQ-12-INF'")->fetch()['id'];
$p18 = (int)$pdo->query("SELECT id FROM products WHERE codigo='SKU-ALIQ-18-INF'")->fetch()['id'];
// Insere primeiro o item de 18% para que a alíquota consolidada do C190 seja 18%
$pdo->exec("INSERT INTO sales_order_items (order_id, product_id, quantidade, preco, total) VALUES ($orderId, $p18, 1.000, 200.00, 200.00)");
$pdo->exec("INSERT INTO sales_order_items (order_id, product_id, quantidade, preco, total) VALUES ($orderId, $p12, 1.000, 100.00, 100.00)");

$gen = new SpedFiscalGenerator($pdo);
$period = new SpedPeriod((int)date('Y'), (int)date('n'));
$lines = $gen->generate($period, ['perfil' => 'A', 'ind_ativ' => 1]);

// Sanidade: há pelo menos um C190
$hasC190 = false; foreach ($lines as $l) { if (str_starts_with($l, '|C190|')) { $hasC190 = true; break; } }
assertTrue($hasC190, 'Contains C190 consolidation record');

// Validador deve acusar "inferior ao esperado" pois parte da base (12%) foi consolidada sob alíquota maior (18%)
$issues = SpedValidator::validateSpedLines($lines);
assertContainsIssue($issues, 'C190 VL_ICMS inferior ao esperado pela alíquota', 'OK: Cross C170→C190 múltiplas alíquotas acusa C190 inferior ao esperado');

echo "OK: C170↔C190 multi-alíquotas validação de inferior ao esperado\n";