<?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();

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

// 1) Criar produto mínimo
$bodyCreate = [
    'codigo' => 'TEST-SKU-PROD-001',
    'ean' => '7891234567000',
    'ncm' => '12345678',
    'cfop' => '5102',
    'preco' => 19.90
];
$reqCreate = new Request($authHeaders, [], $bodyCreate, [], 'POST', '/api/produtos');
$resCreate = $kernel->handle($reqCreate);
assertTrue($resCreate->status === 201, 'POST /api/produtos deve retornar 201');
$newId = (int)($resCreate->body['id'] ?? 0);
assertTrue($newId > 0, 'Resposta de criação deve conter id > 0');

// 2) Salvar meta com nome para aparecer na grid
$meta = ['nome' => 'Produto Teste Endpoint', 'marca' => 'TestBrand'];
$reqMeta = new Request($authHeaders, [], $meta, [], 'POST', "/api/produtos/$newId/meta");
$resMeta = $kernel->handle($reqMeta);
assertTrue($resMeta->status === 200, 'POST /api/produtos/{id}/meta deve retornar 200');

// 3) Inserir mídia diretamente (filename) para testar fallback de URL
$pdo = ConnectionManager::forTenant();
$stmt = $pdo->prepare('INSERT INTO product_media (product_id, type, filename, mime, size, position) VALUES (?,?,?,?,?,?)');
$stmt->execute([$newId, 'image', 'products/' . $newId . '/thumb.png', 'image/png', 1234, 0]);

// 4) Listar produtos e verificar se resposta está OK
$reqList = new Request($authHeaders, ['page'=>1,'per_page'=>20,'q'=>''], [], [], 'GET', '/api/produtos');
$resList = $kernel->handle($reqList);
assertTrue($resList->status === 200, 'GET /api/produtos deve retornar 200');
$data = $resList->body['data'] ?? [];
assertTrue(is_array($data), 'Resposta de listagem deve conter array em data');

// 5) Buscar detalhes do produto
$reqGet = new Request($authHeaders, [], [], [], 'GET', "/api/produtos/$newId");
$resGet = $kernel->handle($reqGet);
assertTrue($resGet->status === 200, 'GET /api/produtos/{id} deve retornar 200');
assertTrue(isset($resGet->body['data']['id']) && (int)$resGet->body['data']['id'] === $newId, 'GET by id deve retornar o produto criado');

// 6) Listar mídias e verificar formato e presença de id
$reqMed = new Request($authHeaders, [], [], [], 'GET', "/api/produtos/$newId/media");
$resMed = $kernel->handle($reqMed);
assertTrue($resMed->status === 200, 'GET /api/produtos/{id}/media deve retornar 200');
$med = $resMed->body['data'] ?? [];
assertTrue(is_array($med), 'Resposta de mídias deve conter data como array');
assertTrue(isset($med[0]['type']) && $med[0]['type'] === 'image', 'Primeira mídia deve ser image');
assertTrue(isset($med[0]['id']), 'Mídia deve conter id para uso no frontend');
// A URL final é composta no frontend; aqui garantimos que ao menos url OU filename exista
assertTrue(isset($med[0]['url']) || isset($med[0]['filename']), 'Mídia deve conter url ou filename');

echo "PASS: ProductsEndpointsTest (create, meta, list, getById, listMedia).\n";