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

use Gestoreasy\Core\Kernel;
use Gestoreasy\Core\Http\Request;

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

$kernel = new Kernel();
$tenant = 'default';

// Preparar ambiente de autenticação por API Key
putenv('SPED_API_KEY=TEST-SPED-KEY');
$_ENV['SPED_API_KEY'] = 'TEST-SPED-KEY';
$headersApi = [ 'x-tenant-id' => $tenant, 'x-api-key' => 'TEST-SPED-KEY' ];

// Criar arquivos de teste
$base = dirname(__DIR__);
$spedDir = $base . '/storage/sped/' . $tenant;
if (!is_dir($spedDir)) { @mkdir($spedDir, 0777, true); }
$spedFile = $spedDir . '/test-doc.xml';
$spedContent = "<nfe>conteudo-de-teste</nfe>";
file_put_contents($spedFile, $spedContent);

$uploadsDir = $base . '/public/uploads';
if (!is_dir($uploadsDir)) { @mkdir($uploadsDir, 0777, true); }
$uploadsFile = $uploadsDir . '/test-upload.txt';
$uploadsContent = "arquivo anexo de teste";
file_put_contents($uploadsFile, $uploadsContent);

echo "=== Teste Automatizado: Lista de Documentos (SPED) ===\n";
$reqListSped = new Request($headersApi, [ 'tipo' => 'SPED', 'page' => 1, 'per_page' => 50 ], [], [], 'GET', '/api/fiscal/documentos');
$resListSped = $kernel->handle($reqListSped);
assertTrue($resListSped->status === 200, 'GET /api/fiscal/documentos deve retornar 200');
assertTrue(is_array($resListSped->body), 'Resposta JSON válida');
assertTrue(!empty($resListSped->body['ok']), 'Campo ok=true');
assertTrue(isset($resListSped->body['data']) && is_array($resListSped->body['data']), 'Contém data[]');
$foundSped = null;
foreach ($resListSped->body['data'] as $it) { if (($it['nome'] ?? '') === 'test-doc.xml') { $foundSped = $it; break; } }
assertTrue($foundSped !== null, 'Item SPED de teste encontrado');
assertTrue(($foundSped['tipo'] ?? '') === 'SPED', 'Tipo SPED correto');
assertTrue(!empty($foundSped['id']) && !empty($foundSped['url']), 'ID e URL presentes');
echo "OK: Listagem SPED validada.\n";

echo "\n=== Teste Automatizado: Download de Documento (SPED) ===\n";
$reqDownload = new Request($headersApi, [ 'id' => $foundSped['id'] ], [], [], 'GET', '/api/fiscal/documentos/download');
$resDownload = $kernel->handle($reqDownload);
assertTrue($resDownload->status === 200, 'GET /api/fiscal/documentos/download deve retornar 200');
assertTrue(is_string($resDownload->body), 'Corpo binário (string)');
assertTrue($resDownload->body === $spedContent, 'Conteúdo do arquivo corresponde');
assertTrue(isset($resDownload->headers['Content-Disposition']) && strpos($resDownload->headers['Content-Disposition'], 'test-doc.xml') !== false, 'Content-Disposition com nome do arquivo');
echo "OK: Download validado.\n";

echo "\n=== Teste Automatizado: Lista de Documentos (ANEXO) ===\n";
$reqListAnexo = new Request($headersApi, [ 'tipo' => 'ANEXO', 'page' => 1, 'per_page' => 50 ], [], [], 'GET', '/api/fiscal/documentos');
$resListAnexo = $kernel->handle($reqListAnexo);
assertTrue($resListAnexo->status === 200, 'GET /api/fiscal/documentos (ANEXO) deve retornar 200');
assertTrue(is_array($resListAnexo->body), 'Resposta JSON válida');
assertTrue(!empty($resListAnexo->body['ok']), 'Campo ok=true');
$foundAnexo = null;
foreach ($resListAnexo->body['data'] as $it) { if (($it['nome'] ?? '') === 'test-upload.txt') { $foundAnexo = $it; break; } }
assertTrue($foundAnexo !== null, 'Item ANEXO de teste encontrado');
assertTrue(($foundAnexo['tipo'] ?? '') === 'ANEXO', 'Tipo ANEXO correto');
echo "OK: Listagem ANEXO validada.\n";

// Limpeza
@unlink($spedFile);
@unlink($uploadsFile);

echo "\n=== Teste Finalizado com sucesso ===\n";
exit(0);