<?php
use Gestoreasy\Core\Kernel;
use Gestoreasy\Core\Http\Request;
use Gestoreasy\Core\Auth\Jwt;
use Gestoreasy\Core\Tenant\TenantAdmin;
use Gestoreasy\Core\Tenant\ConnectionManager;

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

function assertTrue($cond, $msg) { if (!$cond) { throw new Exception($msg); } }

$kernel = new Kernel();
$tenant = (getenv('TEST_TENANT') ?: 'default');
TenantAdmin::runMigrations($tenant);
$token = Jwt::sign(['sub' => 1, 'email' => 'admin@local', 'name' => 'Admin', 'tenant' => $tenant, 'roles' => ['admin']]);
$auth = ['authorization' => 'Bearer ' . $token, 'x-tenant-id' => $tenant];

// Criar produtos para teste de autocomplete
$pdo = ConnectionManager::forTenant($tenant);
try { $pdo->exec("DELETE FROM products"); } catch (\Throwable $e) {}
$pdo->exec("INSERT INTO products (codigo, descricao, estoque) VALUES ('ABA-001','Abacaxi Doce', 10)"); $p1 = (int)$pdo->lastInsertId();
$pdo->exec("INSERT INTO products (codigo, descricao, estoque) VALUES ('BAN-002','Banana Nanica', 15)"); $p2 = (int)$pdo->lastInsertId();
$pdo->exec("INSERT INTO products (codigo, descricao, estoque) VALUES ('ABF-003','Abafador Industrial', 2)"); $p3 = (int)$pdo->lastInsertId();

// Buscar com termo >=3 caracteres ("aba") — deve trazer pelo menos Abacaxi
$reqSearch1 = new Request($auth, ['q' => 'aba', 'per_page' => 10], [], [], 'GET', '/api/produtos');
$resSearch1 = $kernel->handle($reqSearch1);
assertTrue(($resSearch1->status ?? 0) === 200, 'GET /api/produtos deve retornar 200');
$data1 = (array)($resSearch1->body['data'] ?? []);
assertTrue(count($data1) >= 1, 'Autocomplete: deve retornar pelo menos 1 item para "aba"');
$codes1 = array_map(fn($x)=> (string)($x['codigo'] ?? ''), $data1);
assertTrue(in_array('ABA-001', $codes1), 'Deve conter código ABA-001');

// Buscar com termo "ban" — deve trazer Banana
$reqSearch2 = new Request($auth, ['q' => 'ban', 'per_page' => 10], [], [], 'GET', '/api/produtos');
$resSearch2 = $kernel->handle($reqSearch2);
assertTrue(($resSearch2->status ?? 0) === 200, 'GET /api/produtos deve retornar 200');
$data2 = (array)($resSearch2->body['data'] ?? []);
assertTrue(count($data2) >= 1, 'Autocomplete: deve retornar pelo menos 1 item para "ban"');
$codes2 = array_map(fn($x)=> (string)($x['codigo'] ?? ''), $data2);
assertTrue(in_array('BAN-002', $codes2), 'Deve conter código BAN-002');

// Selecionar um produto e definir threshold; depois buscar pelo ID específico
$reqSet = new Request($auth, [], ['product_id' => $p1, 'min_stock' => 12, 'max_stock' => 0, 'alert_enabled' => 1, 'notify_email' => 'alerts@test.local'], [], 'POST', '/api/estoque/thresholds');
$resSet = $kernel->handle($reqSet);
assertTrue(($resSet->status ?? 0) === 200, 'Definir threshold deve retornar 200');

$reqGet = new Request($auth, [], [], [], 'GET', "/api/estoque/thresholds/{$p1}");
$resGet = $kernel->handle($reqGet);
assertTrue(($resGet->status ?? 0) === 200, 'Obter threshold por ID deve retornar 200');
$th = (array)($resGet->body['data'] ?? []);
assertTrue((int)($th['product_id'] ?? 0) === $p1, 'Threshold retornado deve ser do produto selecionado');
assertTrue((int)($th['min_stock'] ?? 0) === 12, 'Threshold deve refletir min_stock=12');
assertTrue((int)($th['alert_enabled'] ?? 0) === 1, 'Threshold deve refletir alert_enabled=1');

echo "ProductAutocompleteTest: OK\n";