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

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

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

// Preparação: criar produto de teste e garantir configuração inicial
$pdo = ConnectionManager::forTenant();
try {
    $pdo->exec("DELETE FROM products WHERE codigo = 'TSTNEG'");
} catch (\Throwable $e) { /* tolerar ausência da tabela */ }
$stmt = $pdo->prepare('INSERT INTO products (codigo, descricao, estoque) VALUES (?,?,?)');
$stmt->execute(['TSTNEG', 'Produto Teste Negativo', 5]);
$pid = (int)$pdo->lastInsertId();
assertTrue($pid > 0, 'Produto de teste deve ser criado');

// Helper: definir permitir_estoque_negativo (insere/atualiza conforme necessário)
function setNegPolicy(PDO $pdo, int $enable): void {
    try {
        $row = $pdo->query('SELECT id FROM inventory_settings ORDER BY id ASC LIMIT 1')->fetch();
        if ($row && isset($row['id'])) {
            $upd = $pdo->prepare('UPDATE inventory_settings SET permitir_estoque_negativo = ?, updated_at = NOW(), updated_by = NULL WHERE id = ?');
            $upd->execute([$enable, (int)$row['id']]);
        } else {
            $ins = $pdo->prepare('INSERT INTO inventory_settings (permitir_estoque_negativo, updated_at, updated_by) VALUES (?,?,?)');
            $ins->execute([$enable, date('Y-m-d H:i:s'), null]);
        }
    } catch (\Throwable $e) { /* tolerar em ambiente sem tabela */ }
}

$kernel = new Kernel();
$token = Jwt::sign(['sub' => 1, 'email' => 'admin@local', 'name' => 'Test Admin', 'tenant' => 'default'], 600);

// Cenário 1: política DESABILITADA (espera 422 insuficiente)
setNegPolicy($pdo, 0);
$req1 = new Request([
    'authorization' => 'Bearer ' . $token,
    'content-type' => 'application/json',
    'x-tenant-id' => 'default'
], [], ['product_id' => $pid, 'quantity' => 10, 'reason' => 'teste_saida'], [], 'POST', '/api/estoque/movimentos/saida');
$res1 = $kernel->handle($req1);
assertTrue($res1->status === 422, 'Saída deve falhar quando negativo desabilitado');
echo "PASS: Bloqueio de saída com estoque insuficiente quando negativo desabilitado.\n";

// Cenário 2: política HABILITADA (espera sucesso e estoque negativo)
setNegPolicy($pdo, 1);
$req2 = new Request([
    'authorization' => 'Bearer ' . $token,
    'content-type' => 'application/json',
    'x-tenant-id' => 'default'
], [], ['product_id' => $pid, 'quantity' => 10, 'reason' => 'teste_saida_negativa'], [], 'POST', '/api/estoque/movimentos/saida');
$res2 = $kernel->handle($req2);
assertTrue($res2->status === 200, 'Saída deve permitir negativo quando habilitado');
$row = $pdo->query('SELECT estoque FROM products WHERE id = ' . (int)$pid)->fetch();
$estoque = isset($row['estoque']) ? (float)$row['estoque'] : 0.0;
assertTrue($estoque === -5.0, 'Estoque deve ser -5 após saída 10 de 5');
echo "PASS: Saída permitida com negativo habilitado e estoque atualizado para -5.\n";

echo "OK: Testes de política de estoque negativo (Estoque::movimentos/saida) concluídos.\n";