<?php
// Testes automatizados: totais e atualização em Pedidos de Venda.

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

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

function assertTrue($cond, $msg = '') { if(!$cond){ throw new Exception('ASSERT TRUE FAIL: ' . $msg); } }
function assertEq($exp, $act, $msg = '') { if($exp != $act){ throw new Exception("ASSERT EQ FAIL: $msg | exp=".var_export($exp,true)." act=".var_export($act,true)); } }
function assertStatus($res, $status, $msg = '') { assertTrue(($res->status ?? null) === $status, $msg . " (status " . ($res->status ?? 'null') . ")"); }
function r2($n){ return round((float)$n, 2); }

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

// Arrange: cliente e dois produtos
$clientBody = [ 'tipo' => 'PF', 'cpf' => '529.982.247-25', 'nome_fantasia' => 'Cliente Testes Pedidos', 'razao_social' => 'Cliente Testes Pedidos Ltda', 'ie' => 'ISENTO', 'estado' => 'SP' ];
$resClient = $kernel->handle(new Request($H, [], $clientBody, [], 'POST', '/api/clientes')); assertStatus($resClient, 201, 'Criar cliente');
$clienteId = (int)($resClient->body['id'] ?? 0); assertTrue($clienteId > 0, 'ID cliente > 0');

$resP1 = $kernel->handle(new Request($H, [], [ 'codigo' => 'SKU-ORDER-001', 'ncm' => '12345678', 'cfop' => '5102', 'preco' => 100.00 ], [], 'POST', '/api/produtos')); assertStatus($resP1, 201, 'Criar produto 1'); $p1 = (int)$resP1->body['id'];
$resP2 = $kernel->handle(new Request($H, [], [ 'codigo' => 'SKU-ORDER-002', 'ncm' => '87654321', 'cfop' => '5102', 'preco' => 50.00 ], [], 'POST', '/api/produtos')); assertStatus($resP2, 201, 'Criar produto 2'); $p2 = (int)$resP2->body['id'];

// Cenário 1: Criar pedido com 2 itens e validar total
$orderBody = [ 'cliente_id' => $clienteId, 'items' => [ ['product_id' => $p1, 'quantidade' => 2], ['product_id' => $p2, 'quantidade' => 3] ] ];
$resCreate = $kernel->handle(new Request($H, [], $orderBody, [], 'POST', '/api/vendas/pedidos'));
assertStatus($resCreate, 201, 'Criar pedido'); $orderId = (int)($resCreate->body['id'] ?? 0); assertTrue($orderId > 0, 'ID pedido > 0');
$resGet = $kernel->handle(new Request($H, [], [], [], 'GET', "/api/vendas/pedidos/$orderId"));
assertStatus($resGet, 200, 'Obter pedido'); $tot = (float)($resGet->body['data']['order']['valor_total'] ?? -1);
assertTrue(abs($tot - r2(2*100 + 3*50)) < 0.0001, 'Total pedido criação');

// Cenário 2: Atualizar pedido substituindo itens e validar novo total
$updBody = [ 'items' => [ ['product_id' => $p1, 'quantidade' => 1], ['product_id' => $p2, 'quantidade' => 1] ] ];
$resUpd = $kernel->handle(new Request($H, [], $updBody, [], 'PUT', "/api/vendas/pedidos/$orderId"));
assertStatus($resUpd, 200, 'Atualizar pedido');
$resGet2 = $kernel->handle(new Request($H, [], [], [], 'GET', "/api/vendas/pedidos/$orderId"));
assertStatus($resGet2, 200, 'Obter pedido após update'); $tot2 = (float)($resGet2->body['data']['order']['valor_total'] ?? -1);
assertTrue(abs($tot2 - r2(1*100 + 1*50)) < 0.0001, 'Total pedido após update');

// Cenário 3: Atualizar status do pedido e garantir persistência sem alterar total
$resStatus = $kernel->handle(new Request($H, [], ['status' => 'faturado'], [], 'PUT', "/api/vendas/pedidos/$orderId"));
assertStatus($resStatus, 200, 'Atualizar status do pedido');
$resGet3 = $kernel->handle(new Request($H, [], [], [], 'GET', "/api/vendas/pedidos/$orderId"));
assertStatus($resGet3, 200, 'Obter pedido após status'); $tot3 = (float)($resGet3->body['data']['order']['valor_total'] ?? -1);
assertTrue(abs($tot3 - $tot2) < 0.0001, 'Total permanece ao mudar status');

echo "PASS: SalesOrdersTotalsTest (totais de pedidos e atualização).\n";