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

// Preparar 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
];

// 1) Criar veículo mínimo
$bodyCreate = [
    'placa' => 'ZZZ1Z99', // Mercosul válida e única para este teste
    'modelo' => 'Onix',
    'marca' => 'Chevrolet',
    'tipo' => 'carro'
];
$reqCreate = new Request($authHeaders, [], $bodyCreate, [], 'POST', '/api/servicos/veiculos');
$resCreate = $kernel->handle($reqCreate);
assertTrue($resCreate->status === 200, 'POST /api/servicos/veiculos deve retornar 200');
$newId = (int)($resCreate->body['id'] ?? 0);
assertTrue($newId > 0, 'Veículo criado deve retornar id > 0');

// 2) Listar veículos e verificar se retorno inclui data
$reqList = new Request($authHeaders, ['q' => ''], [], [], 'GET', '/api/servicos/veiculos');
$resList = $kernel->handle($reqList);
assertTrue($resList->status === 200, 'GET /api/servicos/veiculos deve retornar 200');
$data = $resList->body['data'] ?? [];
assertTrue(is_array($data), 'Resposta de listagem deve conter array em data');

// 3) Buscar veículo por id
$reqGet = new Request($authHeaders, [], [], [], 'GET', "/api/servicos/veiculos/$newId");
$resGet = $kernel->handle($reqGet);
assertTrue($resGet->status === 200, 'GET /api/servicos/veiculos/{id} deve retornar 200');
assertTrue((int)($resGet->body['data']['id'] ?? 0) === $newId, 'GET by id deve retornar o veículo criado');

// 4) Atualizar veículo
$bodyUpdate = [
    'modelo' => 'Onix Plus',
    'placa_info' => ['fonte' => 'teste', 'score' => 0.9]
];
$reqUpdate = new Request($authHeaders, [], $bodyUpdate, [], 'PUT', "/api/servicos/veiculos/$newId");
$resUpdate = $kernel->handle($reqUpdate);
assertTrue($resUpdate->status === 200, 'PUT /api/servicos/veiculos/{id} deve retornar 200');
assertTrue(($resUpdate->body['ok'] ?? false) === true, 'Resposta de update deve conter ok=true');

// 5) Tentar criar duplicado de placa
$dupBody = [
    'placa' => 'ZZZ1Z99',
    'modelo' => 'Outro',
];
$reqDup = new Request($authHeaders, [], $dupBody, [], 'POST', '/api/servicos/veiculos');
$resDup = $kernel->handle($reqDup);
assertTrue($resDup->status === 409, 'POST duplicado deve retornar 409');

// 6) Remover veículo
$reqDel = new Request($authHeaders, [], [], [], 'DELETE', "/api/servicos/veiculos/$newId");
$resDel = $kernel->handle($reqDel);
assertTrue($resDel->status === 200, 'DELETE /api/servicos/veiculos/{id} deve retornar 200');
assertTrue(($resDel->body['ok'] ?? false) === true, 'Resposta de delete deve conter ok=true');

// 7) Confirmar que não existe mais
$reqGetGone = new Request($authHeaders, [], [], [], 'GET', "/api/servicos/veiculos/$newId");
$resGetGone = $kernel->handle($reqGetGone);
assertTrue($resGetGone->status === 404, 'GET após exclusão deve retornar 404');

echo "PASS: ServicesVehiclesEndpointsTest (create, list, get, update, duplicate, delete).\n";