<?php
require_once __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); } }

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

// Preparar dados mínimos: empresa, depósito, fornecedor e produto
$pdo = ConnectionManager::forTenant();
$pdo->exec('DELETE FROM suppliers WHERE nome LIKE "Test Supplier%"');
$pdo->exec('DELETE FROM empresas WHERE nome LIKE "Empresa Test%"');
$pdo->exec('DELETE FROM warehouses WHERE name LIKE "Depósito Test%"');
$pdo->exec('DELETE FROM products WHERE codigo LIKE "TEST-SKU-PO-%"');

$pdo->prepare('INSERT INTO empresas (nome, cnpj) VALUES (?, ?)')->execute(['Empresa Test Compras', '00.000.000/0001-00']);
$empresaId = (int)$pdo->lastInsertId();
$pdo->prepare('INSERT INTO warehouses (name) VALUES (?)')->execute(['Depósito Test Compras']);
$whId = (int)$pdo->lastInsertId();
$pdo->prepare('INSERT INTO suppliers (nome, cnpj, contato) VALUES (?,?,?)')->execute(['Test Supplier PO', '11.111.111/0001-11', 'Contato Teste']);
$supplierId = (int)$pdo->lastInsertId();
$pdo->prepare('INSERT INTO products (codigo, descricao, preco, unidade) VALUES (?,?,?,?)')->execute(['TEST-SKU-PO-001', 'Produto Teste PO', 12.34, 'UN']);
$productId = (int)$pdo->lastInsertId();

// 1) Criar cotação com item para o fornecedor
$quoteBody = [
  'supplier_id' => $supplierId,
  'valid_until' => date('Y-m-d', strtotime('+10 days')),
  'status' => 'open',
  'items' => [ [ 'product_id' => $productId, 'quantity' => 5, 'price' => 10.50 ] ]
];
$reqQuote = new Request($authHeaders, [], $quoteBody, [], 'POST', '/api/compras/cotacoes');
$resQuote = $kernel->handle($reqQuote);
assertTrue(($resQuote->status ?? 0) === 201 || ($resQuote->status ?? 0) === 200, 'POST /api/compras/cotacoes deve retornar 201/200');
$quoteId = (int)($resQuote->body['data']['id'] ?? 0);
assertTrue($quoteId > 0, 'Resposta de criação de cotação deve conter id > 0');

// 2) Listar cotações por fornecedor com status=open
$reqListQ = new Request($authHeaders, ['supplier_id' => $supplierId, 'status' => 'open', 'page' => 1, 'per_page' => 10], [], [], 'GET', '/api/compras/cotacoes');
$resListQ = $kernel->handle($reqListQ);
assertTrue(($resListQ->status ?? 0) === 200, 'GET /api/compras/cotacoes deve retornar 200');
$dataQ = $resListQ->body['data'] ?? [];
assertTrue(is_array($dataQ) && count($dataQ) >= 1, 'Lista de cotações por fornecedor deve conter pelo menos 1 item');

// 3) Buscar cotação por ID e verificar itens
$reqGetQ = new Request($authHeaders, [], [], [], 'GET', "/api/compras/cotacoes/$quoteId");
$resGetQ = $kernel->handle($reqGetQ);
assertTrue(($resGetQ->status ?? 0) === 200, 'GET /api/compras/cotacoes/{id} deve retornar 200');
$itemsQ = $resGetQ->body['data']['items'] ?? [];
assertTrue(is_array($itemsQ) && count($itemsQ) >= 1, 'Cotação deve retornar lista de itens');

// 4) Criar ordem de compra com entrega futura
$tomorrow = date('Y-m-d', strtotime('+1 day'));
$orderBody = [
  'empresa_id' => $empresaId,
  'warehouse_id' => $whId,
  'supplier_id' => $supplierId,
  'operacao' => 'compra',
  'approval_level_required' => 0,
  'condicao_pagamento' => '30/60 dias',
  'condicao_entrega' => 'FOB',
  'observacoes' => 'Teste de criação de OC',
  'items' => [ [
    'product_id' => $productId,
    'quantity' => 3,
    'unit_price' => 12.34,
    'freight' => 2.00,
    'extra_expenses' => 1.00,
    'delivery_date' => $tomorrow
  ] ]
];
$reqOrder = new Request($authHeaders, [], $orderBody, [], 'POST', '/api/compras/ordens');
$resOrder = $kernel->handle($reqOrder);
assertTrue(($resOrder->status ?? 0) === 201, 'POST /api/compras/ordens deve retornar 201');
$orderId = (int)($resOrder->body['data']['id'] ?? 0);
assertTrue($orderId > 0, 'Criação de ordem deve retornar id > 0');

// 5) Tentativa inválida: item sem delivery_date
$badOrderBody = $orderBody;
$badOrderBody['items'][0]['delivery_date'] = null;
$reqOrderBad = new Request($authHeaders, [], $badOrderBody, [], 'POST', '/api/compras/ordens');
$resOrderBad = $kernel->handle($reqOrderBad);
assertTrue(($resOrderBad->status ?? 0) === 422, 'POST /api/compras/ordens sem delivery_date deve retornar 422');

echo "PASS: PurchasesQuotesAndOrdersEndpointsTest (cotação por fornecedor, show, criação de OC e validação de entrega).\n";
?>