<?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 lead básico com valor para conversão
$leadBody = [
    'company' => 'Empresa Teste CRM',
    'contact_name' => 'Carlos',
    'email' => 'crm@example.com',
    'phone' => '11999990000',
    'source' => 'test',
    'stage_id' => 1,
    'status' => 'ativo',
    'value_cents' => 123400,
    'notes' => 'Lead criado por teste automatizado'
];
$reqCreateLead = new Request($authHeaders, [], $leadBody, [], 'POST', '/api/vendas/crm/leads');
$resCreateLead = $kernel->handle($reqCreateLead);
assertTrue($resCreateLead->status === 200, 'POST /api/vendas/crm/leads deve retornar 200');
$leadId = (int)($resCreateLead->body['id'] ?? 0);
assertTrue($leadId > 0, 'Resposta de criação de lead deve conter id > 0');

// 2) Listar leads usando filtro q
$reqListLeads = new Request($authHeaders, ['q' => 'Empresa Teste CRM'], [], [], 'GET', '/api/vendas/crm/leads');
$resListLeads = $kernel->handle($reqListLeads);
assertTrue($resListLeads->status === 200, 'GET /api/vendas/crm/leads deve retornar 200');
assertTrue(is_array($resListLeads->body['items'] ?? null), 'Listagem de leads deve conter items como array');

// 3) Criar atividade para o lead
$actBody = [ 'type' => 'call', 'subject' => 'Contato inicial', 'notes' => 'Ligação de apresentação' ];
$reqCreateAct = new Request($authHeaders, [], $actBody, [], 'POST', "/api/vendas/crm/leads/$leadId/atividades");
$resCreateAct = $kernel->handle($reqCreateAct);
assertTrue($resCreateAct->status === 200, 'POST /api/vendas/crm/leads/{id}/atividades deve retornar 200');
$actId = (int)($resCreateAct->body['id'] ?? 0);
assertTrue($actId > 0, 'Resposta de criação de atividade deve conter id > 0');

// 4) Listar atividades do lead
$reqListActs = new Request($authHeaders, [], [], [], 'GET', "/api/vendas/crm/leads/$leadId/atividades");
$resListActs = $kernel->handle($reqListActs);
assertTrue($resListActs->status === 200, 'GET /api/vendas/crm/leads/{id}/atividades deve retornar 200');
$itemsActs = $resListActs->body['items'] ?? [];
assertTrue(is_array($itemsActs) && count($itemsActs) >= 1, 'Listagem de atividades deve conter ao menos 1 item');

// 5) Marcar atividade como concluída
$doneAt = date('Y-m-d H:i:s');
$reqUpdateAct = new Request($authHeaders, [], ['done_at' => $doneAt], [], 'PUT', "/api/vendas/crm/atividades/$actId");
$resUpdateAct = $kernel->handle($reqUpdateAct);
assertTrue($resUpdateAct->status === 200, 'PUT /api/vendas/crm/atividades/{id} deve retornar 200');
assertTrue(($resUpdateAct->body['ok'] ?? false) === true, 'Update de atividade deve retornar ok=true');

// 6) Converter lead em orçamento
$reqConvQuote = new Request($authHeaders, [], [], [], 'POST', "/api/vendas/crm/leads/$leadId/convert/quote");
$resConvQuote = $kernel->handle($reqConvQuote);
assertTrue($resConvQuote->status === 200, 'POST /api/vendas/crm/leads/{id}/convert/quote deve retornar 200');
assertTrue(($resConvQuote->body['ok'] ?? false) === true, 'Conversão para orçamento deve retornar ok=true');
assertTrue(isset($resConvQuote->body['quote_id']) && isset($resConvQuote->body['quote_numero']), 'Conversão deve retornar quote_id e quote_numero');

// 7) Converter lead em pedido
$reqConvOrder = new Request($authHeaders, [], [], [], 'POST', "/api/vendas/crm/leads/$leadId/convert/order");
$resConvOrder = $kernel->handle($reqConvOrder);
assertTrue($resConvOrder->status === 200, 'POST /api/vendas/crm/leads/{id}/convert/order deve retornar 200');
assertTrue(($resConvOrder->body['ok'] ?? false) === true, 'Conversão para pedido deve retornar ok=true');
assertTrue(isset($resConvOrder->body['order_id']) && isset($resConvOrder->body['order_numero']), 'Conversão deve retornar order_id e order_numero');

// 8) Pipeline
$reqPipeline = new Request($authHeaders, [], [], [], 'GET', '/api/vendas/crm/pipeline');
$resPipeline = $kernel->handle($reqPipeline);
assertTrue($resPipeline->status === 200, 'GET /api/vendas/crm/pipeline deve retornar 200');
assertTrue(is_array($resPipeline->body['stages'] ?? null), 'Resposta de pipeline deve conter stages como array');

// 9) Kanban
$reqKanban = new Request($authHeaders, [], [], [], 'GET', '/api/vendas/crm/kanban');
$resKanban = $kernel->handle($reqKanban);
assertTrue($resKanban->status === 200, 'GET /api/vendas/crm/kanban deve retornar 200');
assertTrue(is_array($resKanban->body['columns'] ?? null), 'Resposta de kanban deve conter columns como array');

// 10) Exportar CSV
$reqExport = new Request($authHeaders, ['q' => 'Empresa Teste CRM'], [], [], 'GET', '/api/vendas/crm/export.csv');
$resExport = $kernel->handle($reqExport);
assertTrue($resExport->status === 200, 'GET /api/vendas/crm/export.csv deve retornar 200');
assertTrue(is_string($resExport->body), 'Export CSV deve retornar conteúdo string');
assertTrue(strpos($resExport->body, 'Empresa') !== false, 'CSV deve conter cabeçalho Empresa');

// 11) Importar orçamentos e pedidos
$pdo = ConnectionManager::forTenant();

// Criar cliente para vincular a orçamento/pedido
$pdo->prepare('INSERT INTO clients (nome, tipo) VALUES (?, ?)')->execute(['Cliente Teste CRM', 'PF']);
$clientId = (int)$pdo->lastInsertId();

// Inserir orçamento simples
$numeroQ = 'OR-' . str_pad((string)rand(1,999999), 9, '0', STR_PAD_LEFT);
$pdo->prepare('INSERT INTO sales_quotes (numero, cliente_id, valor_total, status, created_at) VALUES (?,?,?,?,?)')
    ->execute([$numeroQ, $clientId, 250.75, 'rascunho', date('Y-m-d H:i:s')]);

// Inserir pedido simples
$numeroO = 'SO-' . date('Ymd-His') . '-' . substr((string)(microtime(true) * 1000000), -6);
$pdo->prepare('INSERT INTO sales_orders (numero, cliente_id, valor_total, status, vendedor_email, created_at) VALUES (?,?,?,?,?,?)')
    ->execute([$numeroO, $clientId, 420.50, 'aberto', 'seller@local', date('Y-m-d H:i:s')]);

// Importar orçamentos
$reqImpQ = new Request($authHeaders, ['start' => '2000-01-01'], [], [], 'POST', '/api/vendas/crm/import/quotes');
$resImpQ = $kernel->handle($reqImpQ);
assertTrue($resImpQ->status === 200, 'POST /api/vendas/crm/import/quotes deve retornar 200');
assertTrue(($resImpQ->body['ok'] ?? false) === true, 'Import de quotes deve retornar ok=true');
assertTrue(($resImpQ->body['created'] ?? 0) >= 1, 'Import de quotes deve criar pelo menos 1 lead');

// Importar pedidos
$reqImpO = new Request($authHeaders, ['start' => '2000-01-01'], [], [], 'POST', '/api/vendas/crm/import/orders');
$resImpO = $kernel->handle($reqImpO);
assertTrue($resImpO->status === 200, 'POST /api/vendas/crm/import/orders deve retornar 200');
assertTrue(($resImpO->body['ok'] ?? false) === true, 'Import de orders deve retornar ok=true');
assertTrue(($resImpO->body['created'] ?? 0) >= 1, 'Import de orders deve criar pelo menos 1 lead');

echo "PASS: SalesCrmEndpointsTest (leads CRUD-lite, atividades, conversões, kanban/pipeline, export, import).\n";
?>