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

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

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

$kernel = new Kernel();

// Token admin para tenant default
$payload = [ 'sub' => 1, 'email' => 'admin@local', 'name' => 'Admin', 'tenant' => 'default', 'roles' => ['admin'], 'impersonated' => true ];
$token = Jwt::sign($payload);
$authHeaders = [ 'x-tenant-id' => 'default', 'authorization' => 'Bearer ' . $token ];

// Empresas: create, list, get, update, delete
$bodyEmpCreate = [ 'nome' => 'Empresa Teste Ltda', 'cnpj' => '12345678000100', 'email' => 'contato@empresa.test' ];
$reqEmpCreate = new Request($authHeaders, [], $bodyEmpCreate, [], 'POST', '/api/cadastros/empresas');
$resEmpCreate = $kernel->handle($reqEmpCreate);
assertTrue($resEmpCreate->status === 201, 'POST /api/cadastros/empresas deve retornar 201');
$empId = (int)($resEmpCreate->body['data']['id'] ?? 0);
assertTrue($empId > 0, 'Empresa criada deve retornar id > 0');

$reqEmpList = new Request($authHeaders, ['q' => 'Empresa Teste'], [], [], 'GET', '/api/cadastros/empresas');
$resEmpList = $kernel->handle($reqEmpList);
assertTrue($resEmpList->status === 200, 'GET /api/cadastros/empresas deve retornar 200');

$reqEmpGet = new Request($authHeaders, [], [], [], 'GET', "/api/cadastros/empresas/$empId");
$resEmpGet = $kernel->handle($reqEmpGet);
assertTrue($resEmpGet->status === 200, 'GET /api/cadastros/empresas/{id} deve retornar 200');

$reqEmpUpdate = new Request($authHeaders, [], ['email' => 'novo@empresa.test'], [], 'PUT', "/api/cadastros/empresas/$empId");
$resEmpUpdate = $kernel->handle($reqEmpUpdate);
assertTrue($resEmpUpdate->status === 200, 'PUT /api/cadastros/empresas/{id} deve retornar 200');

$reqEmpDelete = new Request($authHeaders, [], [], [], 'DELETE', "/api/cadastros/empresas/$empId");
$resEmpDelete = $kernel->handle($reqEmpDelete);
assertTrue($resEmpDelete->status === 204, 'DELETE /api/cadastros/empresas/{id} deve retornar 204');

// Fornecedores: create (relacionado à empresa), list, get, update, delete
// Criar empresa base para relação
$reqEmpCreate2 = new Request($authHeaders, [], ['nome' => 'Empresa Base', 'cnpj' => '00999999000100'], [], 'POST', '/api/cadastros/empresas');
$resEmpCreate2 = $kernel->handle($reqEmpCreate2);
$empRelId = (int)($resEmpCreate2->body['data']['id'] ?? 0);
assertTrue($empRelId > 0, 'Empresa base para fornecedor deve existir');

$bodyFornCreate = [ 'empresa_id' => $empRelId, 'nome' => 'Fornecedor XPTO', 'cnpj' => '11222333000144', 'email' => 'contato@forn.test' ];
$reqFornCreate = new Request($authHeaders, [], $bodyFornCreate, [], 'POST', '/api/cadastros/fornecedores');
$resFornCreate = $kernel->handle($reqFornCreate);
assertTrue($resFornCreate->status === 201, 'POST /api/cadastros/fornecedores deve retornar 201');
$fornId = (int)($resFornCreate->body['data']['id'] ?? 0);
assertTrue($fornId > 0, 'Fornecedor criado deve retornar id > 0');

$reqFornList = new Request($authHeaders, ['q' => 'XPTO'], [], [], 'GET', '/api/cadastros/fornecedores');
$resFornList = $kernel->handle($reqFornList);
assertTrue($resFornList->status === 200, 'GET /api/cadastros/fornecedores deve retornar 200');

$reqFornGet = new Request($authHeaders, [], [], [], 'GET', "/api/cadastros/fornecedores/$fornId");
$resFornGet = $kernel->handle($reqFornGet);
assertTrue($resFornGet->status === 200, 'GET /api/cadastros/fornecedores/{id} deve retornar 200');

$reqFornUpdate = new Request($authHeaders, [], ['telefone' => '1199999-0000'], [], 'PUT', "/api/cadastros/fornecedores/$fornId");
$resFornUpdate = $kernel->handle($reqFornUpdate);
assertTrue($resFornUpdate->status === 200, 'PUT /api/cadastros/fornecedores/{id} deve retornar 200');

$reqFornDelete = new Request($authHeaders, [], [], [], 'DELETE', "/api/cadastros/fornecedores/$fornId");
$resFornDelete = $kernel->handle($reqFornDelete);
assertTrue($resFornDelete->status === 204, 'DELETE /api/cadastros/fornecedores/{id} deve retornar 204');

echo "PASS: CadastrosEndpointsTest (empresas + fornecedores CRUD).\n";