<?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: exportação CSV e notificações de vencimento\n\n";

$kernel = new Kernel();

// Token com bypass de RBAC via impersonated
$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
];

// Preparar tabelas
$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_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)
)');

$tag = 'EXP_' . time();
$today = date('Y-m-d');

// Criar contas E (venc +1 dia, 6000), F (venc +4 dias, 6000) ambas pendentes
$create = function($desc, $valor, $days){
  global $kernel, $authHeaders, $tag, $today;
  $body = [
    'descricao' => $desc . ' ' . $tag,
    'valor' => $valor,
    'data_vencimento' => date('Y-m-d', strtotime($today . " +$days days")),
    'fornecedor' => 'Tech Ltda',
    'documento' => $desc
  ];
  $req = new Request($authHeaders, [], $body, [], 'POST', '/api/financeiro/contas-pagar');
  $res = $kernel->handle($req);
  assertEq($res->status, 201, 'Criar ' . $desc);
  return (int)($res->body['id'] ?? 0);
};

$idE = $create('Conta E', 6000.00, 1);
$idF = $create('Conta F', 6000.00, 4);

// Aprovar nível 1 apenas para F (para garantir N2 pendente)
$reqAprF = new Request($authHeaders, [], ['level' => 1, 'status' => 'aprovado', 'notes' => 'ok f1'], [], 'POST', "/api/financeiro/contas-pagar/$idF/aprovar");
$resAprF = $kernel->handle($reqAprF);
assertEq($resAprF->status, 200, 'Aprovação N1 para F');

// List com approval_level=2&approval_status=pendente isolando por q=$tag
$reqList = new Request($authHeaders, [
  'q' => $tag,
  'approval_level' => 2,
  'approval_status' => 'pendente'
], [], [], 'GET', '/api/financeiro/contas-pagar');
$resList = $kernel->handle($reqList);
assertEq($resList->status, 200, 'List pendente N2');
$listRows = $resList->body['data'] ?? [];
$listCount = count($listRows);
assertTrue($listCount >= 2, 'Esperado >= 2 contas com N2 pendente (E e F)');

// Export CSV com os mesmos filtros e verificar contagem de linhas
$reqCsv = new Request($authHeaders, [
  'q' => $tag,
  'approval_level' => 2,
  'approval_status' => 'pendente'
], [], [], 'GET', '/api/financeiro/contas-pagar/export.csv');
$resCsv = $kernel->handle($reqCsv);
assertEq($resCsv->status, 200, 'Export CSV 200');
$csv = (string)$resCsv->body;
$lines = array_filter(explode("\n", trim($csv)), fn($l) => trim($l) !== '');
// CSV inclui uma linha de cabeçalho; comparar apenas linhas de dados
assertTrue((count($lines) - 1) === $listCount, 'CSV deve conter a mesma quantidade de linhas da listagem filtrada');

// Notificar vencimentos (days=2) deve pegar apenas E (venc +1) e não F (venc +4)
$reqNotify = new Request($authHeaders, ['days' => 2], [], [], 'POST', '/api/financeiro/contas-pagar/notify-due');
$resNotify = $kernel->handle($reqNotify);
assertEq($resNotify->status, 200, 'Notify due 200');
$notifyBody = $resNotify->body;
assertTrue(($notifyBody['count'] ?? 0) >= 1, 'Notificações disparadas para ao menos 1 conta a vencer');

echo "PASS: FinanceiroContasPagarExportAndNotifyTest (CSV filtros e notify vencimentos)\n";