<?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;

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

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

// Seed minimal company
$pdo->exec("INSERT INTO empresas (nome, razao_social, cnpj, ie, email, telefone, created_at)
    SELECT 'Empresa Demo', 'Empresa Demo Ltda', '12.345.678/0001-99', '123456789', 'contato@demo.com', '(21)3333-3333', NOW()
    WHERE NOT EXISTS (SELECT 1 FROM empresas)");
$pdo->exec("UPDATE empresas SET estado='RJ' WHERE estado IS NULL OR estado='' ");

$gen = new SpedFiscalGenerator($pdo);
$period = new SpedPeriod((int)date('Y'), (int)date('n'));

// Gera linhas padrão e força inconsistência alterando ALIQ_ICMS de um C190
$lines = $gen->generate($period, [ 'perfil' => 'A', 'ind_ativ' => 1 ]);
assertTrue(in_array('|C001|0|', $lines, true), 'Bloco C com movimento');

$mutated = [];
foreach ($lines as $l) {
  if (str_starts_with($l, '|C190|')) {
    $p = explode('|', trim($l));
    // indexes: 4=ALIQ_ICMS, 6=VL_BC_ICMS, 7=VL_ICMS
    if (count($p) >= 13 && $p[4] !== '' && $p[6] !== '' && $p[7] !== '') {
      $aliq = (float)$p[4]; $bc = (float)$p[6]; $icms = (float)$p[7];
      // Se base e ICMS forem positivos, aumentamos a alíquota para provocar "inferior ao esperado"
      if ($bc > 0.001 && $icms > 0.001) {
        $newAliq = $aliq + 5.0; // eleva 5pp
        $p[4] = number_format($newAliq, 2, '.', '');
        $l = implode('|', $p);
        // garante barra final
        if (!str_ends_with($l, '|')) { $l .= '|'; }
        $mutated[] = $l;
        continue;
      }
    }
  }
  $mutated[] = $l;
}

$issues = SpedValidator::validateSpedLines($mutated);
assertContainsIssue($issues, 'C190 VL_ICMS inferior ao esperado pela alíquota', 'OK: Validator acusa C190 ICMS inferior ao esperado pela alíquota');

echo "OK: C190 com VL_ICMS inferior ao esperado foi corretamente sinalizado pelo validador\n";