<?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 assertEq($a, $b, $msg) { if ($a !== $b) { echo "FAIL: $msg (" . var_export($a, true) . " !== " . var_export($b, true) . ")\n"; exit(1); } }
function assertTrue($cond, $msg) { if (!$cond) { echo "FAIL: $msg\n"; exit(1); } }

echo "Financeiro: fluxo Contas a Pagar (create -> approve -> pay -> history -> comprovante -> reconcile)\n\n";

$kernel = new Kernel();

// Preparar token com bypass de RBAC via impersonated para facilitar testes
$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
];

// Garantir tabelas necessárias (ambientes sem migrações completas)
$pdo = ConnectionManager::forTenant('default');
$pdo->exec('CREATE TABLE IF NOT EXISTS contas_pagar (
  id INT AUTO_INCREMENT PRIMARY KEY,
  descricao VARCHAR(255) NOT NULL,
  fornecedor VARCHAR(255) NOT NULL,
  valor DECIMAL(12,2) NOT NULL,
  documento VARCHAR(100) NULL,
  observacoes TEXT NULL,
  status VARCHAR(20) NOT NULL DEFAULT "pendente",
  data_vencimento DATE NOT NULL,
  data_pagamento DATE NULL,
  valor_pago DECIMAL(12,2) NULL,
  forma_pagamento VARCHAR(50) NULL,
  observacoes_pagamento TEXT NULL,
  reconciled_at DATETIME NULL,
  reconciliation_reference VARCHAR(100) NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  updated_at TIMESTAMP NULL
)');
$pdo->exec('CREATE TABLE IF NOT EXISTS contas_pagar_pagamentos (
  id INT AUTO_INCREMENT PRIMARY KEY,
  conta_id INT NOT NULL,
  data_pagamento DATE NOT NULL,
  valor_pago DECIMAL(12,2) NOT NULL,
  forma_pagamento VARCHAR(50) NOT NULL,
  observacoes TEXT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  INDEX idx_pag_conta (conta_id)
)');
$pdo->exec('CREATE TABLE IF NOT EXISTS contas_pagar_aprovacoes (
  id INT AUTO_INCREMENT PRIMARY KEY,
  conta_id INT NOT NULL,
  level INT NOT NULL,
  status VARCHAR(20) NOT NULL,
  approved_by INT NULL,
  approved_at TIMESTAMP NULL,
  notes TEXT NULL,
  INDEX idx_apr_conta (conta_id)
)');

// 1) Criar conta (valor >= 5000 para exigir 2 níveis de aprovação)
$bodyCreate = [
  'descricao' => 'Assinatura ERP',
  'valor' => 6000.00,
  'data_vencimento' => date('Y-m-d', strtotime('+2 days')),
  'fornecedor' => 'Tech Ltda',
  'documento' => 'NF-12345'
];
$reqCreate = new Request($authHeaders, [], $bodyCreate, [], 'POST', '/api/financeiro/contas-pagar');
$resCreate = $kernel->handle($reqCreate);
assertEq($resCreate->status, 201, 'Criar conta deve retornar 201');
$contaId = (int)($resCreate->body['id'] ?? 0);
assertTrue($contaId > 0, 'ID da conta criada deve ser > 0');

// 2) Duas aprovações (níveis 1 e 2)
$reqApr1 = new Request($authHeaders, [], ['level' => 1, 'status' => 'aprovado'], [], 'POST', "/api/financeiro/contas-pagar/$contaId/aprovar");
$resApr1 = $kernel->handle($reqApr1); assertEq($resApr1->status, 200, 'Aprovação nível 1');
$reqApr2 = new Request($authHeaders, [], ['level' => 2, 'status' => 'aprovado'], [], 'POST', "/api/financeiro/contas-pagar/$contaId/aprovar");
$resApr2 = $kernel->handle($reqApr2); assertEq($resApr2->status, 200, 'Aprovação nível 2');

// 3) Pagar
$reqPay = new Request($authHeaders, [], ['forma_pagamento' => 'pix'], [], 'POST', "/api/financeiro/contas-pagar/$contaId/pagar");
$resPay = $kernel->handle($reqPay); assertEq($resPay->status, 200, 'Pagamento da conta');

// 4) Histórico de pagamentos
$reqHist = new Request($authHeaders, [], [], [], 'GET', "/api/financeiro/contas-pagar/$contaId/historico");
$resHist = $kernel->handle($reqHist); assertEq($resHist->status, 200, 'Histórico');
$hist = $resHist->body['data'] ?? [];
assertTrue(is_array($hist) && count($hist) >= 1, 'Histórico deve ter pelo menos 1 linha');

// 5) View de comprovante (HTML)
$reqView = new Request($authHeaders, [], [], [], 'GET', "/financeiro/contas-pagar/$contaId/comprovante");
$resView = $kernel->handle($reqView);
assertEq($resView->status, 200, 'Comprovante HTML deve retornar 200');
$html = (string)$resView->body;
assertTrue(strpos($html, 'Comprovante de Pagamento') !== false, 'HTML deve conter cabeçalho Comprovante');
assertTrue(strpos($html, (string)$contaId) !== false, 'HTML deve conter ID da conta');

// 6) Conciliação bancária
$reference = 'BANK-' . $contaId . '-' . time();
$reqRec = new Request($authHeaders, [], ['reference' => $reference], [], 'POST', "/api/financeiro/contas-pagar/$contaId/conciliar");
$resRec = $kernel->handle($reqRec); assertEq($resRec->status, 200, 'Conciliação');
$recJson = $resRec->body;
assertTrue(($recJson['bank_status'] ?? '') === 'confirmed', 'Status bancário confirmado');

echo "PASS: FinanceiroContasPagarFlowTest (create→approve→pay→history→comprovante→reconcile)\n";