<?php
/**
 * Depto de Engenharia e Automação - Master Automação - Autor: Derlivon Silva
 * (parte do Premium Express BI - Fire Sistemas)
 *
 * Ponto de entrada único da aplicação Premium Express Gestão.
 * Todas as requisições HTTP passam por aqui (via .htaccess ou servidor embutido).
 */

declare(strict_types=1);

// Erros vão para o log, nunca para a saída HTTP (evita corromper JSON das APIs)
ini_set('display_errors', '0');
ini_set('display_startup_errors', '0');
ini_set('log_errors', '1');

// ── Servidor embutido: serve arquivos estáticos/PHP diretamente ──────────────
if (PHP_SAPI === 'cli-server') {
    $reqFile = __DIR__ . parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH);
    if (is_file($reqFile)) {
        // Arquivo .php existente → executa diretamente (não passa pelo router)
        if (str_ends_with($reqFile, '.php')) {
            require $reqFile;
            exit;
        }
        // Arquivo estático → deixa o servidor embutido servir
        return false;
    }
}

// ── Autoloader PSR-4 simples ─────────────────────────────────────────────────
spl_autoload_register(function (string $class): void {
    // Mapeia 'App\Core\Router' → '../app/Core/Router.php'
    $prefix = 'App\\';
    $baseDir = __DIR__ . '/../app/';

    if (!str_starts_with($class, $prefix)) {
        return;
    }

    $relative = substr($class, strlen($prefix));
    $file = $baseDir . str_replace('\\', DIRECTORY_SEPARATOR, $relative) . '.php';

    if (file_exists($file)) {
        require_once $file;
    }
});

// ── Inicializa cache com caminho absoluto (elimina ambiguidade de __DIR__) ───
\App\Core\Cache::init(dirname(__DIR__) . '/storage/cache');

// Cozinha é módulo normal do BI agora — sem redirect automático na raiz.
// Acesso controlado pela permissão 'cozinha' no Gerenciador de Usuários.

// ── Carrega configuração da aplicação ────────────────────────────────────────
$config = require __DIR__ . '/../config/app.php';

// ── Inicializa a aplicação ───────────────────────────────────────────────────
$app    = new \App\Core\Application($config);
$router = $app->getRouter();

// ── Auth middleware — verifica login e permissao de modulo ──────────────────
(function() {
    $uri = parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH);

    // Rotas publicas: nao precisam de FbAuth
    $rotasPublicas = ['/login', '/autenticar', '/logout', '/sem-permissao', '/personalizar', '/set-tema'];
    if (in_array($uri, $rotasPublicas, true)) return;

    // Prefixos publicos: admin tem auth propria, leitor tem auth via PIN
    if (str_starts_with($uri, '/admin') || str_starts_with($uri, '/leitor')) return;

    // Servidor de atualização: manifesto + pacote são públicos (clientes baixam sem login).
    if (str_starts_with($uri, '/atualizacoes')) return;

    // Leitor autenticado pode acessar APIs de produtos sem login do BI
    if (!empty($_SESSION['leitor_ok']) &&
        (str_starts_with($uri, '/api/produtos/') || str_starts_with($uri, '/api/leitor/'))) return;

    // Verifica se esta logado
    \App\Core\FbAuth::guard();

    // Verifica permissao de modulo (se aplicavel)
    $modulo = \App\Core\FbAuth::moduloDaUri($uri);
    if ($modulo !== null) {
        \App\Core\FbAuth::guardModulo($modulo);
    }
})();

// ── Multi-loja: o modo "Todas as lojas" só vale na tela /consolidado.
// Ao abrir QUALQUER outro módulo/card, cai automaticamente para a loja PRINCIPAL (maior).
(function() {
    if (!\App\Core\Lojas::multi() || !\App\Core\Lojas::consolidado()) return;
    $u = parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH);
    // Chamadas de API/background (ex.: /api/alertas/count disparado pelo layout em TODA
    // página) NÃO podem desligar o modo "Todas as lojas" — senão o consolidado cai sozinho.
    if (str_starts_with((string)$u, '/api/')) return;
    // mantém "Todas" só aqui — inclui /set-periodo p/ trocar o mês SEM sair do consolidado
    if ($u === '/consolidado' || $u === '/set-loja' || $u === '/set-periodo') return;
    \App\Core\Lojas::setConsolidado(false);
    $p = \App\Core\Lojas::padraoId();
    if ($p !== null) \App\Core\Lojas::setAtiva($p);
})();

// ── Multi-loja: restringe a loja ATIVA às lojas permitidas ao usuário ───────
// (usuário limitado a "Importados" não consegue ver/consultar outra loja.)
\App\Core\FbAuth::enforcarLojaAtiva();

// ── Auth Firebird ───────────────────────────────────────────────────────────
$router->get('/login',                        [\App\Controllers\LoginController::class,    'index']);
$router->post('/autenticar',                  [\App\Controllers\LoginController::class,    'autenticar']);
$router->get('/logout',                       [\App\Controllers\LoginController::class,    'logout']);
$router->get('/sem-permissao',                [\App\Controllers\LoginController::class,    'semPermissao']);

// ── Usuarios ────────────────────────────────────────────────────────────────
$router->get('/configurar/usuarios',          [\App\Controllers\UsuariosController::class, 'index']);
$router->post('/configurar/usuarios/salvar',  [\App\Controllers\UsuariosController::class, 'salvar']);
$router->post('/configurar/usuarios/novo',    [\App\Controllers\UsuariosController::class, 'novo']);

// ── Definição de rotas ───────────────────────────────────────────────────────
$router->get('/',                   [\App\Controllers\HomeController::class,   'index']);
$router->get('/dashboard',          [\App\Controllers\DashboardController::class, 'index']);
$router->get('/api/dashboard/data', [\App\Controllers\DashboardController::class, 'dashboardApi']);
$router->get('/executivo',          [\App\Controllers\ExecutivoController::class, 'index']);
$router->get('/api/executivo/data', [\App\Controllers\ExecutivoController::class, 'api']);
$router->get('/alertas',            [\App\Controllers\AlertasController::class, 'index']);
$router->get('/api/alertas/data',   [\App\Controllers\AlertasController::class, 'api']);
$router->get('/api/alertas/count',  [\App\Controllers\AlertasController::class, 'count']);
$router->get('/devolucoes',          [\App\Controllers\DevolucoesController::class, 'index']);
$router->get('/api/devolucoes/data', [\App\Controllers\DevolucoesController::class, 'api']);
$router->get('/previsao',            [\App\Controllers\PrevisaoController::class,   'index']);
$router->get('/api/previsao/data',   [\App\Controllers\PrevisaoController::class,   'api']);
// ── Auditoria ──────────────────────────────────────────────────────────────
$router->get('/auditoria',                                    [\App\Controllers\AuditoriaController::class, 'index']);
$router->get('/api/auditoria/resumo',                         [\App\Controllers\AuditoriaController::class, 'resumoApi']);
$router->get('/auditoria/desconto-operadora',                 [\App\Controllers\AuditoriaController::class, 'descontoOperadora']);
$router->get('/api/auditoria/desconto-operadora',             [\App\Controllers\AuditoriaController::class, 'descontoOperadoraApi']);
$router->get('/api/auditoria/desconto-operadora/notas',       [\App\Controllers\AuditoriaController::class, 'notasComDescontoApi']);
$router->get('/auditoria/cancelamentos-operadora',            [\App\Controllers\AuditoriaController::class, 'cancelamentosOperadora']);
$router->get('/api/auditoria/cancelamentos-operadora',        [\App\Controllers\AuditoriaController::class, 'cancelamentosOperadoraApi']);
$router->get('/api/auditoria/cancelamentos-operadora/notas',  [\App\Controllers\AuditoriaController::class, 'notasCanceladasApi']);
$router->get('/auditoria/liberacoes-caixa',                   [\App\Controllers\AuditoriaController::class, 'liberacoesCaixa']);
$router->get('/api/auditoria/liberacoes-caixa',               [\App\Controllers\AuditoriaController::class, 'liberacoesCaixaApi']);
$router->get('/api/auditoria/liberacoes-caixa/detalhe',       [\App\Controllers\AuditoriaController::class, 'liberacoesDetalheApi']);
$router->get('/api/auditoria/liberacoes-caixa/por-supervisor',[\App\Controllers\AuditoriaController::class, 'liberacoesPorSupervisorApi']);
$router->get('/api/auditoria/liberacoes-caixa/perfil',        [\App\Controllers\AuditoriaController::class, 'liberacoesPerfilApi']);
$router->get('/api/auditoria/liberacoes-caixa/info',          [\App\Controllers\AuditoriaController::class, 'liberacaoInfoApi']);
// ── Admin auth ──────────────────────────────────────────────────────────────
$router->get('/admin/login',         [\App\Controllers\AdminAuthController::class, 'login']);
$router->post('/admin/autenticar',   [\App\Controllers\AdminAuthController::class, 'autenticar']);
$router->get('/admin/setup',         [\App\Controllers\AdminAuthController::class, 'setup']);
$router->post('/admin/setup/salvar', [\App\Controllers\AdminAuthController::class, 'salvarSetup']);
$router->get('/admin/logout',            [\App\Controllers\AdminAuthController::class, 'logout']);
$router->get('/admin/senha',             [\App\Controllers\AdminAuthController::class, 'senha']);
$router->post('/admin/senha/alterar',    [\App\Controllers\AdminAuthController::class, 'alterarSenha']);
$router->get('/admin/reauth',            [\App\Controllers\AdminAuthController::class, 'reauth']);
$router->post('/admin/reauth/confirmar', [\App\Controllers\AdminAuthController::class, 'confirmarReauth']);

$router->get('/configurar',         [\App\Controllers\ConfigController::class, 'index']);
$router->post('/configurar',        [\App\Controllers\ConfigController::class, 'salvar']);
$router->post('/configurar/testar', [\App\Controllers\ConfigController::class, 'testar']);
// ── Configuração: códigos de operação que contam como venda ────────────────
$router->get('/configuracao/tipos-venda',  [\App\Controllers\TiposVendaController::class, 'index']);
$router->post('/configuracao/tipos-venda', [\App\Controllers\TiposVendaController::class, 'salvar']);
// ── Diagnostico de Operacoes — Vendas vs ERP (tela interna, fora do menu) ──
// Depto de Engenharia e Automação - Master Automação - Autor: Derlivon Silva
$router->get('/diag/operacoes',            [\App\Controllers\DiagOperacoesController::class, 'index']);
// ── Diagnostico do Cadastro — Raio-X de qualidade do cadastro de produtos ──
$router->get('/diag/cadastro',             [\App\Controllers\DiagCadastroController::class, 'index']);
// Endpoint JSON do cadastro fiscal (sob demanda, chamado pelo gerarPDFFiscal)
$router->get('/diag/cadastro/fiscal-json', [\App\Controllers\DiagCadastroController::class, 'fiscalJson']);
// ── Top 100 SKUs Criticos — foco da limpeza de cadastro (Achadinhos/Compras)
// Depto de Engenharia e Automação - Master Automação - Autor: Derlivon Silva
$router->get('/cadastro/top-criticos',          [\App\Controllers\TopCriticosController::class, 'index']);
$router->get('/api/cadastro/top-criticos/csv',  [\App\Controllers\TopCriticosController::class, 'exportarCsvApi']);
$router->get('/configurar/lojas',          [\App\Controllers\LojasAdminController::class, 'index']);
$router->post('/configurar/lojas/salvar',  [\App\Controllers\LojasAdminController::class, 'salvar']);
$router->post('/configurar/lojas/remover', [\App\Controllers\LojasAdminController::class, 'remover']);
$router->post('/configurar/lojas/testar',  [\App\Controllers\LojasAdminController::class, 'testar']);
$router->get('/atualizacoes/versao.json',            [\App\Controllers\AtualizacaoController::class, 'manifestoPublico']);
$router->get('/atualizacoes/pacote.zip',             [\App\Controllers\AtualizacaoController::class, 'pacotePublico']);
$router->get('/configurar/atualizacao',              [\App\Controllers\AtualizacaoController::class, 'index']);
$router->post('/api/configurar/atualizacao/url',     [\App\Controllers\AtualizacaoController::class, 'salvarUrlApi']);
$router->get('/api/configurar/atualizacao/verificar',[\App\Controllers\AtualizacaoController::class, 'verificarApi']);
$router->post('/api/configurar/atualizacao/aplicar', [\App\Controllers\AtualizacaoController::class, 'aplicarApi']);
$router->get('/personalizar',       [\App\Controllers\ConfigController::class, 'personalizar']);
$router->post('/set-tema',          [\App\Controllers\ConfigController::class, 'setTema']);
$router->get('/tabelas',            [\App\Controllers\TabelasController::class,    'index']);
$router->get('/tabelas/listar',     [\App\Controllers\TabelasController::class,    'listar']);
$router->get('/tabelas/info/:nome', [\App\Controllers\TabelasController::class,    'info']);
$router->get('/sql-console',        [\App\Controllers\SqlConsoleController::class,  'index']);
$router->post('/sql-console/executar', [\App\Controllers\SqlConsoleController::class, 'executar']);

// ── Vendas ───────────────────────────────────────────────────────────────────
$router->get('/vendas',                    [\App\Controllers\VendasController::class, 'gestao']);
$router->get('/vendas/gestao',             [\App\Controllers\VendasController::class, 'gestao']);
$router->get('/vendas/diarias',            [\App\Controllers\VendasController::class, 'diarias']);
$router->get('/vendas/mensais',            [\App\Controllers\VendasController::class, 'mensais']);
$router->get('/vendas/por-vendedor',       [\App\Controllers\VendasController::class, 'porVendedor']);
$router->get('/vendas/por-grupo',          [\App\Controllers\VendasController::class, 'porGrupo']);
$router->get('/vendas/por-marca',          [\App\Controllers\VendasController::class, 'porMarca']);
$router->get('/vendas/notas-saida',        [\App\Controllers\VendasController::class, 'notasSaida']);
$router->get('/vendas/pre-notas',          [\App\Controllers\VendasController::class, 'preNotas']);
$router->get('/vendas/comparativo',        [\App\Controllers\ComparativoController::class, 'anual']);
$router->get('/vendas/custo-medio',        [\App\Controllers\VendasController::class, 'custoMedioVenda']); // alias legado
$router->get('/compras/custo-medio-venda', [\App\Controllers\VendasController::class, 'custoMedioVenda']); // fica em Compras
$router->get('/api/vendas/custo-medio',        [\App\Controllers\VendasController::class, 'custoMedioVendaApi']);
$router->get('/api/vendas/custo-medio/itens',  [\App\Controllers\VendasController::class, 'itensCupomApi']);
$router->get('/api/vendas/kpis',           [\App\Controllers\VendasController::class, 'kpisGestaoApi']);
$router->get('/api/vendas/gestao-dash',    [\App\Controllers\VendasController::class, 'gestaoDashApi']);
$router->get('/api/vendas/diarias-dash',   [\App\Controllers\VendasController::class, 'diariasDashApi']);
$router->get('/api/vendas/diarias',        [\App\Controllers\VendasController::class, 'diariasApi']);
$router->get('/api/vendas/mensais',        [\App\Controllers\VendasController::class, 'mensaisApi']);
$router->get('/api/vendas/mensais-margem', [\App\Controllers\VendasController::class, 'mensaisMargemApi']);
$router->get('/api/vendas/por-vendedor',   [\App\Controllers\VendasController::class, 'porVendedorApi']);
$router->get('/api/vendas/por-vendedor/extras', [\App\Controllers\VendasController::class, 'porVendedorExtrasApi']);
$router->get('/api/vendas/por-grupo',                [\App\Controllers\VendasController::class, 'porGrupoApi']);
$router->get('/api/vendas/por-marca',                [\App\Controllers\VendasController::class, 'porMarcaApi']);
$router->get('/api/vendas/por-grupo/comparativo',    [\App\Controllers\VendasController::class, 'porGrupoComparativoApi']);
$router->get('/api/vendas/por-marca/comparativo',    [\App\Controllers\VendasController::class, 'porMarcaComparativoApi']);
$router->get('/api/vendas/por-grupo/produtos',       [\App\Controllers\VendasController::class, 'produtosPorGrupoApi']);
$router->get('/api/vendas/por-marca/produtos',       [\App\Controllers\VendasController::class, 'produtosPorMarcaApi']);
$router->get('/api/vendas/notas-saida',         [\App\Controllers\VendasController::class, 'notasSaidaApi']);
$router->get('/api/vendas/notas-saida/resumo',  [\App\Controllers\VendasController::class, 'notasSaidaResumoApi']);
$router->get('/api/vendas/pre-notas',           [\App\Controllers\VendasController::class, 'preNotasApi']);
$router->get('/api/vendas/pre-notas/resumo',    [\App\Controllers\VendasController::class, 'preNotasResumoApi']);

// ── Estoque ──────────────────────────────────────────────────────────────────
$router->get('/estoque',                   [\App\Controllers\EstoqueController::class, 'posicao']);
$router->get('/estoque/posicao',           [\App\Controllers\EstoqueController::class, 'posicao']);
$router->get('/estoque/minimos',           [\App\Controllers\EstoqueController::class, 'minimos']);
$router->get('/estoque/giro',              [\App\Controllers\EstoqueController::class, 'giro']);
$router->get('/estoque/margem',            [\App\Controllers\EstoqueController::class, 'margem']);
$router->get('/estoque/inventario',        [\App\Controllers\EstoqueController::class, 'inventario']);
$router->get('/api/estoque/kpis',          [\App\Controllers\EstoqueController::class, 'kpisApi']);
$router->get('/api/estoque/kpis-minimos',  [\App\Controllers\EstoqueController::class, 'kpisMinimosApi']);
$router->get('/api/estoque/posicao',       [\App\Controllers\EstoqueController::class, 'posicaoApi']);
$router->get('/api/estoque/minimos',       [\App\Controllers\EstoqueController::class, 'minimosApi']);
$router->get('/api/estoque/giro',          [\App\Controllers\EstoqueController::class, 'giroApi']);
$router->get('/api/estoque/margem',        [\App\Controllers\EstoqueController::class, 'margemApi']);
$router->get('/api/estoque/inventario',    [\App\Controllers\EstoqueController::class, 'inventarioApi']);

// ── Financeiro ───────────────────────────────────────────────────────────────
$router->get('/financeiro',                     [\App\Controllers\FinanceiroController::class, 'fluxoCaixa']);
$router->get('/financeiro/fluxo-caixa',         [\App\Controllers\FinanceiroController::class, 'fluxoCaixa']);
$router->get('/financeiro/contas-receber',      [\App\Controllers\FinanceiroController::class, 'contasReceber']);
$router->get('/financeiro/contas-pagar',        [\App\Controllers\FinanceiroController::class, 'contasPagar']);
$router->get('/financeiro/dre',                 [\App\Controllers\FinanceiroController::class, 'dre']);
$router->get('/financeiro/caixa',               [\App\Controllers\FinanceiroController::class, 'caixa']);
$router->get('/api/financeiro/kpis',            [\App\Controllers\FinanceiroController::class, 'kpisApi']);
$router->get('/api/financeiro/fluxo-caixa',     [\App\Controllers\FinanceiroController::class, 'fluxoCaixaApi']);
$router->get('/api/financeiro/contas-receber',  [\App\Controllers\FinanceiroController::class, 'contasReceberApi']);
$router->get('/api/financeiro/contas-pagar',    [\App\Controllers\FinanceiroController::class, 'contasPagarApi']);
$router->get('/api/financeiro/dre',             [\App\Controllers\FinanceiroController::class, 'dreApi']);
$router->get('/api/financeiro/caixa',           [\App\Controllers\FinanceiroController::class, 'caixaApi']);
$router->get('/api/financeiro/caixa/detalhe',   [\App\Controllers\FinanceiroController::class, 'caixaDetalheApi']);
$router->get('/financeiro/mix-pagamento',       [\App\Controllers\FinanceiroController::class, 'mixPagamento']);
$router->get('/api/financeiro/mix-pagamento',   [\App\Controllers\FinanceiroController::class, 'mixPagamentoApi']);

// ── Compras ──────────────────────────────────────────────────────────────────
$router->get('/compras',                        [\App\Controllers\ComprasController::class, 'dashboard']);
$router->get('/compras/dashboard',              [\App\Controllers\ComprasController::class, 'dashboard']);
$router->get('/api/compras/dashboard',          [\App\Controllers\ComprasController::class, 'dashboardApi']);
$router->get('/compras/notas-entrada',          [\App\Controllers\ComprasController::class, 'notasEntrada']);
$router->get('/compras/por-fornecedor',         [\App\Controllers\ComprasController::class, 'porFornecedor']);
$router->get('/compras/compras-vendas',         [\App\Controllers\ComprasController::class, 'comprasVendas']);
$router->get('/compras/sugestao',               [\App\Controllers\SugestaoCompraController::class, 'index']);
$router->get('/api/compras/sugestao',           [\App\Controllers\SugestaoCompraController::class, 'dadosApi']);
$router->get('/api/compras/sugestao/ruptura-count', [\App\Controllers\SugestaoCompraController::class, 'rupturaCountApi']);
$router->get('/compras/ruptura',                [\App\Controllers\RupturaController::class, 'index']);
$router->get('/api/compras/ruptura',            [\App\Controllers\RupturaController::class, 'dadosApi']);
$router->get('/compras/custo-medio',            [\App\Controllers\ComprasController::class, 'custoMedio']);
$router->get('/api/compras/custo-medio',        [\App\Controllers\ComprasController::class, 'custoMedioApi']);
// Margem por Item — Compra × Venda (Depto de Engenharia e Automação - Master Automação - Autor: Derlivon Silva)
$router->get('/compras/margem',                 [\App\Controllers\MargemController::class, 'index']);
$router->get('/api/compras/margem',             [\App\Controllers\MargemController::class, 'dadosApi']);
$router->get('/api/compras/kpis',               [\App\Controllers\ComprasController::class, 'kpisApi']);
$router->get('/api/compras/notas',              [\App\Controllers\ComprasController::class, 'notasApi']);
$router->get('/api/compras/itens-mais-caros',   [\App\Controllers\ComprasController::class, 'itensMaisCarosApi']);
$router->get('/compras/api/itens-mais-caros',   [\App\Controllers\ComprasController::class, 'itensMaisCarosApi']); // alias legado
$router->get('/api/compras/por-fornecedor',     [\App\Controllers\ComprasController::class, 'porFornecedorApi']);
$router->get('/api/compras/compras-vendas',     [\App\Controllers\ComprasController::class, 'comprasVendasApi']);

// ── Mesas ─────────────────────────────────────────────────────────────────────
$router->get('/mesas',                          [\App\Controllers\MesasController::class, 'monitor']);
$router->get('/mesas/monitor',                  [\App\Controllers\MesasController::class, 'monitor']);
$router->get('/mesas/historico',                [\App\Controllers\MesasController::class, 'historico']);
$router->get('/mesas/por-garcom',               [\App\Controllers\MesasController::class, 'porGarcom']);
$router->get('/mesas/tempo-medio',              [\App\Controllers\MesasController::class, 'tempoMedio']);
$router->get('/api/mesas/kpis',                 [\App\Controllers\MesasController::class, 'kpisApi']);
$router->get('/api/mesas/monitor',              [\App\Controllers\MesasController::class, 'monitorApi']);
$router->get('/api/mesas/historico',            [\App\Controllers\MesasController::class, 'historicoApi']);
$router->get('/api/mesas/por-garcom',           [\App\Controllers\MesasController::class, 'porGarcomApi']);
$router->get('/api/mesas/tempo-medio',          [\App\Controllers\MesasController::class, 'tempoMedioApi']);
$router->get('/mesas/comandas-por-garcom',      [\App\Controllers\MesasController::class, 'comandasPorGarcom']);
$router->get('/api/mesas/garcons',              [\App\Controllers\MesasController::class, 'garconsApi']);
$router->get('/api/mesas/comandas-garcom',      [\App\Controllers\MesasController::class, 'comandasGarcomApi']);
$router->get('/api/mesas/itens-mesa',           [\App\Controllers\MesasController::class, 'itensMesaApi']);
$router->get('/mesas/excecoes-caixa',           [\App\Controllers\MesasController::class, 'excecoesCaixa']);
$router->get('/api/mesas/excecoes-caixa',       [\App\Controllers\MesasController::class, 'excecoesCaixaApi']);
$router->get('/api/mesas/excecoes-detalhe',     [\App\Controllers\MesasController::class, 'excecoesDetalheApi']);
$router->get('/mesas/cortesias',                [\App\Controllers\MesasController::class, 'cortesias']);
$router->get('/api/mesas/cortesias',            [\App\Controllers\MesasController::class, 'cortesiasApi']);
$router->get('/mesas/comparativo-hora',         [\App\Controllers\MesasController::class, 'comparativoHora']);
$router->get('/api/mesas/comparativo-hora',     [\App\Controllers\MesasController::class, 'comparativoHoraApi']);
$router->get('/mesas/faixas-horario',           [\App\Controllers\MesasController::class, 'faixasHorario']);
$router->get('/api/mesas/faixas-horario',       [\App\Controllers\MesasController::class, 'faixasHorarioApi']);

// ── Cozinha (KDS — Painel da Cozinha + Relatório de Tempo de Preparo) ───────
// Depto de Engenharia e Automação - Master Automação - Autor: Derlivon Silva
$router->get('/cozinha',                        [\App\Controllers\CozinhaController::class, 'tablet']);
$router->get('/cozinha/menu',                   [\App\Controllers\CozinhaController::class, 'menu']);
$router->get('/cozinha/avisos',                 [\App\Controllers\CozinhaController::class, 'avisos']);
$router->get('/cozinha/meu',                    [\App\Controllers\CozinhaController::class, 'meu']);
$router->get('/cozinha/relatorio',              [\App\Controllers\CozinhaController::class, 'relatorio']);
$router->get('/cozinha/links',                  [\App\Controllers\CozinhaController::class, 'links']);
$router->get('/cozinha/config',                 [\App\Controllers\CozinhaController::class, 'configuracoes']);
$router->get('/api/cozinha/fila',               [\App\Controllers\CozinhaController::class, 'filaApi']);
$router->post('/api/cozinha/finalizar',         [\App\Controllers\CozinhaController::class, 'finalizarApi']);
$router->post('/api/cozinha/desfazer',          [\App\Controllers\CozinhaController::class, 'desfazerApi']);
$router->get('/api/cozinha/avisos-pendentes',   [\App\Controllers\CozinhaController::class, 'avisosApi']);
$router->post('/api/cozinha/marcar-retirado',   [\App\Controllers\CozinhaController::class, 'marcarRetiradoApi']);
$router->get('/api/cozinha/garcons',             [\App\Controllers\CozinhaController::class, 'garconsApi']);
$router->get('/api/cozinha/relatorio',          [\App\Controllers\CozinhaController::class, 'relatorioApi']);
$router->get('/api/cozinha/destinos',           [\App\Controllers\CozinhaController::class, 'destinosApi']);
$router->get('/api/cozinha/grupos',             [\App\Controllers\CozinhaController::class, 'gruposApi']);
$router->post('/api/cozinha/config',            [\App\Controllers\CozinhaController::class, 'salvarConfigApi']);

// ── Clientes ──────────────────────────────────────────────────────────────────
$router->get('/clientes',                       [\App\Controllers\ClientesController::class, 'cadastro']);
$router->get('/clientes/cadastro',              [\App\Controllers\ClientesController::class, 'cadastro']);
$router->get('/clientes/frequencia',            [\App\Controllers\ClientesController::class, 'frequencia']);
$router->get('/clientes/inadimplentes',         [\App\Controllers\ClientesController::class, 'inadimplentes']);
$router->get('/clientes/inativos',              [\App\Controllers\ClientesController::class, 'inativos']);
$router->get('/clientes/ticket-medio',          [\App\Controllers\ClientesController::class, 'ticketMedio']);
$router->get('/api/clientes/kpis',              [\App\Controllers\ClientesController::class, 'kpisApi']);
$router->get('/api/clientes/cadastro',          [\App\Controllers\ClientesController::class, 'cadastroApi']);
$router->get('/api/clientes/frequencia',        [\App\Controllers\ClientesController::class, 'frequenciaApi']);
$router->get('/api/clientes/inadimplentes',     [\App\Controllers\ClientesController::class, 'inadimplentesApi']);
$router->get('/api/clientes/inativos',          [\App\Controllers\ClientesController::class, 'inativosApi']);
$router->get('/api/clientes/ticket-medio',      [\App\Controllers\ClientesController::class, 'ticketMedioApi']);

// ── Pessoal ───────────────────────────────────────────────────────────────────
$router->get('/pessoal',                        [\App\Controllers\PessoalController::class, 'funcionarios']);
$router->get('/pessoal/funcionarios',           [\App\Controllers\PessoalController::class, 'funcionarios']);
$router->get('/pessoal/performance',            [\App\Controllers\PessoalController::class, 'performance']);
$router->get('/pessoal/comissoes',              [\App\Controllers\PessoalController::class, 'comissoes']);
$router->get('/api/pessoal/kpis',               [\App\Controllers\PessoalController::class, 'kpisApi']);
$router->get('/api/pessoal/funcionarios',       [\App\Controllers\PessoalController::class, 'funcionariosApi']);
$router->get('/api/pessoal/performance',        [\App\Controllers\PessoalController::class, 'performanceApi']);
$router->get('/api/pessoal/comissoes',          [\App\Controllers\PessoalController::class, 'comissoesApi']);

// ── Leitor (acesso restrito via PIN) ─────────────────────────────────────────
$router->get('/leitor',                [\App\Controllers\LeitorController::class, 'login']);
$router->post('/leitor',               [\App\Controllers\LeitorController::class, 'login']);
$router->get('/leitor/scanner',        [\App\Controllers\LeitorController::class, 'scanner']);
$router->post('/leitor/logout',        [\App\Controllers\LeitorController::class, 'logout']);
$router->get('/leitor/config',         [\App\Controllers\LeitorController::class, 'config']);
$router->post('/leitor/config',        [\App\Controllers\LeitorController::class, 'config']);
$router->get('/leitor/config/logout',  [\App\Controllers\LeitorController::class, 'configLogout']);
$router->get('/api/leitor/audit',        [\App\Controllers\LeitorController::class, 'auditApi']);
$router->get('/api/leitor/cupom',        [\App\Controllers\LeitorController::class, 'cupomApi']);
$router->post('/api/leitor/manutencao',  [\App\Controllers\LeitorController::class, 'manutencaoApi']);
$router->get('/api/leitor/nfce-recentes',[\App\Controllers\LeitorController::class, 'nfceRecentesApi']);
// Inventário
$router->get('/api/leitor/inventario/sessao',   [\App\Controllers\LeitorInventarioController::class, 'sessaoApi']);
$router->post('/api/leitor/inventario/sessao',  [\App\Controllers\LeitorInventarioController::class, 'sessaoApi']);
$router->post('/api/leitor/inventario/lancar',  [\App\Controllers\LeitorInventarioController::class, 'lancarApi']);
$router->get('/api/leitor/inventario/resumo',   [\App\Controllers\LeitorInventarioController::class, 'resumoApi']);
$router->post('/api/leitor/inventario/remover', [\App\Controllers\LeitorInventarioController::class, 'removerApi']);
$router->post('/api/leitor/inventario/encerrar',[\App\Controllers\LeitorInventarioController::class, 'encerrarApi']);
$router->get('/leitor/fiscal',                [\App\Controllers\LeitorFiscalController::class, 'index']);
$router->get('/api/leitor/fiscal/operadores', [\App\Controllers\LeitorFiscalController::class, 'operadoresApi']);
$router->get('/api/leitor/fiscal/dados',      [\App\Controllers\LeitorFiscalController::class, 'dadosApi']);
$router->post('/api/leitor/fiscal/acao',      [\App\Controllers\LeitorFiscalController::class, 'acaoApi']);
$router->get('/leitor-admin/permissoes',  [\App\Controllers\LeitorPermissoesController::class, 'index']);
$router->post('/leitor-admin/permissoes', [\App\Controllers\LeitorPermissoesController::class, 'index']);

// ── Produtos ──────────────────────────────────────────────────────────────────
$router->get('/produtos',                       [\App\Controllers\ProdutosController::class, 'catalogo']);
$router->get('/produtos/catalogo',              [\App\Controllers\ProdutosController::class, 'catalogo']);
$router->get('/produtos/curva-abc',             [\App\Controllers\ProdutosController::class, 'curvaAbc']);
$router->get('/produtos/sem-movimento',         [\App\Controllers\ProdutosController::class, 'semMovimento']);
$router->get('/produtos/precos',                [\App\Controllers\ProdutosController::class, 'precos']);
$router->get('/produtos/saude',                 [\App\Controllers\ProdutosController::class, 'saude']);

// Manual interativo do BI — ensina cliente a usar cada módulo
$router->get('/manual',                         [\App\Controllers\ManualController::class, 'index']);

// Convênios (Grancard / VR / Alelo / convênios PJ) — segmento varejo
$router->get('/convenios',                      [\App\Controllers\ConveniosController::class, 'painel']);
$router->get('/convenios/painel',               [\App\Controllers\ConveniosController::class, 'painel']);
$router->get('/convenios/aging',                [\App\Controllers\ConveniosController::class, 'aging']);
$router->get('/convenios/top-conveniados',      [\App\Controllers\ConveniosController::class, 'topConveniados']);
$router->get('/api/convenios/painel',           [\App\Controllers\ConveniosController::class, 'painelApi']);
$router->get('/api/convenios/aging',            [\App\Controllers\ConveniosController::class, 'agingApi']);
$router->get('/api/convenios/top-conveniados',  [\App\Controllers\ConveniosController::class, 'topConveniadosApi']);
$router->get('/produtos/ranking',               [\App\Controllers\ProdutosController::class, 'ranking']);
$router->get('/produtos/mais-vendidos',         [\App\Controllers\ProdutosController::class, 'maisVendidos']);
$router->get('/produtos/top-quantidade',        [\App\Controllers\ProdutosController::class, 'topQuantidade']);
$router->get('/produtos/margem-negativa',       [\App\Controllers\ProdutosController::class, 'margemNegativa']);
$router->get('/api/produtos/top-qtd',           [\App\Controllers\ProdutosController::class, 'topQtdApi']);
$router->get('/api/produtos/top-fat',           [\App\Controllers\ProdutosController::class, 'topFatApi']);
$router->get('/api/produtos/margem-negativa',   [\App\Controllers\ProdutosController::class, 'margemNegativaApi']);
$router->get('/api/produtos/saude-kpis',        [\App\Controllers\ProdutosController::class, 'saudeKpisApi']);
$router->get('/api/produtos/saude-lista',       [\App\Controllers\ProdutosController::class, 'saudeListaApi']);
$router->get('/api/produtos/catalogo-kpis',     [\App\Controllers\ProdutosController::class, 'catalogoKpisApi']);
$router->get('/api/produtos/marcas',            [\App\Controllers\ProdutosController::class, 'marcasApi']);
$router->get('/api/produtos/catalogo',          [\App\Controllers\ProdutosController::class, 'catalogoApi']);
$router->get('/api/produtos/foto',              [\App\Controllers\ProdutosController::class, 'fotoApi']);
$router->get('/api/produtos/detalhe',          [\App\Controllers\ProdutosController::class, 'detalheApi']);
$router->post('/api/produtos/atualizar-preco',        [\App\Controllers\ProdutosController::class, 'atualizarPrecoApi']);
$router->post('/api/produtos/atualizar-preco-atacado',[\App\Controllers\ProdutosController::class, 'atualizarPrecoAtacadoApi']);
$router->post('/api/produtos/ajustar-estoque',        [\App\Controllers\ProdutosController::class, 'ajustarEstoqueApi']);
$router->post('/api/produtos/atualizar-campos',       [\App\Controllers\ProdutosController::class, 'atualizarCamposApi']);
$router->get('/api/produtos/buscar-barras',    [\App\Controllers\ProdutosController::class, 'buscarBarrasApi']);
$router->post('/api/produtos/atualizar-foto',  [\App\Controllers\ProdutosController::class, 'atualizarFotoApi']);
$router->get('/api/produtos/kpis',              [\App\Controllers\ProdutosController::class, 'kpisApi']);
$router->get('/api/produtos/curva-abc',         [\App\Controllers\ProdutosController::class, 'curvaAbcApi']);
$router->get('/api/produtos/sem-movimento',     [\App\Controllers\ProdutosController::class, 'semMovimentoApi']);
$router->get('/api/produtos/precos',            [\App\Controllers\ProdutosController::class, 'precosApi']);

// ── Fechamento de Caixa ───────────────────────────────────────────────────────
$router->get('/caixa/fechamento',            [\App\Controllers\FechamentoCaixaController::class, 'index']);
$router->get('/caixa/fechamento/dados',      [\App\Controllers\FechamentoCaixaController::class, 'dados']);
$router->get('/caixa/fechamento/operadores', [\App\Controllers\FechamentoCaixaController::class, 'operadores']);

// ── Despesas ──────────────────────────────────────────────────────────────────
$router->get('/financeiro/despesas',        [\App\Controllers\DespesasController::class, 'index']);
$router->post('/financeiro/despesas/salvar',[\App\Controllers\DespesasController::class, 'salvar']);

// ── Metas ─────────────────────────────────────────────────────────────────────
$router->get('/metas',                          [\App\Controllers\MetasController::class, 'index']);
$router->post('/metas/salvar',                  [\App\Controllers\MetasController::class, 'salvar']);
$router->get('/metas/vendedores',               [\App\Controllers\MetasController::class, 'vendedores']);
$router->post('/metas/vendedores/salvar',       [\App\Controllers\MetasController::class, 'salvarVendedores']);
$router->get('/api/metas/vendedores',           [\App\Controllers\MetasController::class, 'vendedoresApi']);

// ── Comparativo ───────────────────────────────────────────────────────────────
$router->get('/comparativo',                    [\App\Controllers\ComparativoController::class, 'anual']);
$router->get('/comparativo/anual',              [\App\Controllers\ComparativoController::class, 'anual']);
$router->get('/comparativo/top-produtos',       [\App\Controllers\ComparativoController::class, 'topProdutosJson']);
$router->get('/comparativo/api/anual',          [\App\Controllers\ComparativoController::class, 'apiAnualDados']);
$router->get('/comparativo/api/hoje',           [\App\Controllers\ComparativoController::class, 'apiHoje']);
$router->get('/comparativo/api/semana',         [\App\Controllers\ComparativoController::class, 'apiSemana']);
$router->get('/comparativo/api/mes',            [\App\Controllers\ComparativoController::class, 'apiMes']);
$router->get('/comparativo/api/heatmap',        [\App\Controllers\ComparativoController::class, 'apiHeatmap']);
$router->get('/comparativo/api/vendedores',     [\App\Controllers\ComparativoController::class, 'apiVendedores']);
$router->get('/comparativo/api/tendencias',     [\App\Controllers\ComparativoController::class, 'apiTendencias']);
$router->get('/comparativo/api/insights',       [\App\Controllers\ComparativoController::class, 'apiInsights']);

// ── Relatórios ────────────────────────────────────────────────────────────────
$router->get('/relatorios',                     [\App\Controllers\RelatoriosController::class, 'index']);
$router->get('/relatorios/vendas',              [\App\Controllers\RelatoriosController::class, 'vendas']);
$router->get('/relatorios/vendas-avancado',     [\App\Controllers\RelatorioVendasController::class, 'index']);
$router->get('/api/relatorios/vendas-avancado', [\App\Controllers\RelatorioVendasController::class, 'dadosApi']);
$router->get('/api/relatorios/vendas-avancado/lookups', [\App\Controllers\RelatorioVendasController::class, 'lookupsApi']);
$router->get('/relatorios/compras',             [\App\Controllers\RelatoriosController::class, 'compras']);
$router->get('/relatorios/compras-avancado',     [\App\Controllers\RelatorioComprasController::class, 'index']);
$router->get('/api/relatorios/compras-avancado', [\App\Controllers\RelatorioComprasController::class, 'dadosApi']);
$router->get('/api/relatorios/compras-avancado/lookups', [\App\Controllers\RelatorioComprasController::class, 'lookupsApi']);
$router->get('/relatorios/dre',                 [\App\Controllers\RelatoriosController::class, 'dre']);
$router->get('/relatorios/curva-abc',           [\App\Controllers\RelatoriosController::class, 'curvaAbc']);
$router->get('/relatorios/clientes',            [\App\Controllers\RelatoriosController::class, 'clientes']);
$router->get('/relatorios/garcons',             [\App\Controllers\RelatoriosController::class, 'garcons']);
$router->get('/relatorios/estoque',             [\App\Controllers\RelatoriosController::class, 'estoque']);
$router->get('/relatorios/inadimplencia',       [\App\Controllers\RelatoriosController::class, 'inadimplencia']);
$router->get('/relatorios/comissoes',           [\App\Controllers\RelatoriosController::class, 'comissoes']);
$router->get('/relatorios/margem',              [\App\Controllers\RelatoriosController::class, 'margem']);

// ── Período global (session) ─────────────────────────────────────────────────
$router->post('/set-periodo', function(): void {
    $ano = isset($_POST['ano']) && ctype_digit($_POST['ano']) ? (int)$_POST['ano'] : null;
    $mes = isset($_POST['mes']) && ctype_digit($_POST['mes']) ? (int)$_POST['mes'] : null;
    if ($ano && $ano >= 2010 && $ano <= 2100) $_SESSION['filtro_ano'] = $ano;
    if ($mes !== null && $mes >= 0 && $mes <= 12) $_SESSION['filtro_mes'] = $mes;
    $redirect = $_POST['redirect'] ?? '/';
    // Sanitiza redirect para evitar open redirect
    if (!str_starts_with($redirect, '/')) $redirect = '/';
    // Trocar o período voltando p/ o consolidado NÃO pode sair do modo "Todas as
    // lojas" — reativa explicitamente (robusto mesmo se o middleware desligar).
    if (str_starts_with($redirect, '/consolidado')
        && \App\Core\Lojas::multi() && \App\Core\FbAuth::podeConsolidado()) {
        \App\Core\Lojas::setConsolidado(true);
    }
    header('Location: ' . $redirect);
    exit;
});

// ── Troca de loja ativa (multi-loja) ────────────────────────────────────────
$router->post('/set-loja', function(): void {
    $loja = $_POST['loja'] ?? '';
    if ($loja === '__todas__') {
        if (\App\Core\FbAuth::podeConsolidado()) {   // só quem pode ver 2+ lojas
            \App\Core\Lojas::setConsolidado(true);
            header('Location: /consolidado');
            exit;
        }
        // sem permissão p/ "Todas" → ignora (mantém loja atual)
    }
    $trocou = false;
    if ($loja !== '' && \App\Core\Lojas::existe($loja) && \App\Core\FbAuth::podeLoja($loja)) {
        \App\Core\Lojas::setConsolidado(false);
        \App\Core\Lojas::setAtiva($loja);
        $trocou = true;
    }
    $redirect = $_POST['redirect'] ?? '/';
    if (!str_starts_with($redirect, '/')) $redirect = '/';
    // Trocou p/ uma loja específica estando na tela "Todas as lojas"? Vai pro
    // dashboard da loja (a /consolidado só serve ao modo consolidado).
    if ($trocou && str_starts_with($redirect, '/consolidado')) $redirect = '/';
    header('Location: ' . $redirect);
    exit;
});
$router->get('/consolidado', [\App\Controllers\ConsolidadoController::class, 'index']);

// ── Descoberta de usuários/operadores (temporário) ──────────────────────────
$router->get('/dev/usuarios', function(): void {
    header('Content-Type: text/html; charset=utf-8');
    $pdo = \App\Core\Database::conectar();

    $tabelas = $pdo->query("
        SELECT TRIM(r.RDB\$RELATION_NAME) AS TABELA
        FROM RDB\$RELATIONS r
        WHERE r.RDB\$SYSTEM_FLAG = 0
          AND (
              UPPER(r.RDB\$RELATION_NAME) LIKE '%USUAR%'
           OR UPPER(r.RDB\$RELATION_NAME) LIKE '%OPERA%'
           OR UPPER(r.RDB\$RELATION_NAME) LIKE '%LOGIN%'
           OR UPPER(r.RDB\$RELATION_NAME) LIKE '%SUPER%'
           OR UPPER(r.RDB\$RELATION_NAME) LIKE '%FUNC%'
           OR UPPER(r.RDB\$RELATION_NAME) LIKE '%CAIXA%'
           OR UPPER(r.RDB\$RELATION_NAME) LIKE '%SENHA%'
           OR UPPER(r.RDB\$RELATION_NAME) LIKE '%ACESSO%'
           OR UPPER(r.RDB\$RELATION_NAME) LIKE '%PERMIS%'
          )
        ORDER BY TABELA
    ")->fetchAll(\PDO::FETCH_COLUMN);

    echo '<style>body{font-family:monospace;background:#0d0f14;color:#e2e8f0;padding:2rem}h2{color:#4f8ef7}pre{background:#1e2130;padding:1rem;border-radius:6px}</style>';
    echo '<h2>Tabelas encontradas:</h2><pre>';
    foreach ($tabelas as $tab) {
        echo "\n=== $tab ===\n";
        $cols = $pdo->query("
            SELECT TRIM(f.RDB\$FIELD_NAME) AS COLUNA
            FROM RDB\$RELATION_FIELDS f
            WHERE TRIM(f.RDB\$RELATION_NAME) = '$tab'
            ORDER BY f.RDB\$FIELD_POSITION
        ")->fetchAll(\PDO::FETCH_COLUMN);
        echo "Colunas: " . implode(', ', $cols) . "\n";
        try {
            $rows = $pdo->query("SELECT FIRST 3 * FROM \"$tab\"")->fetchAll(\PDO::FETCH_ASSOC);
            foreach ($rows as $r) {
                foreach ($r as $k => $v) echo "  $k: $v\n";
                echo "  ---\n";
            }
        } catch (\Throwable $e) { echo "  (sem dados: " . $e->getMessage() . ")\n"; }
    }
    echo "</pre>";

    echo '<h2>Campo operador na NOTAS_CAB:</h2><pre>';
    foreach (['COD_USUARIO','USUARIO','LOGIN','OPERADOR','COD_OPERADOR','NOME_USUARIO','COD_FUNC'] as $col) {
        try {
            $r = $pdo->query("SELECT FIRST 5 TRIM($col) AS V FROM NOTAS_CAB WHERE $col IS NOT NULL AND TRIM(CAST($col AS VARCHAR(100))) <> ''")->fetchAll(\PDO::FETCH_COLUMN);
            if (!empty($r)) echo "✅ $col: " . implode(', ', $r) . "\n";
            else echo "⚠️  $col: existe mas vazio\n";
        } catch (\Throwable) { echo "❌ $col: não existe\n"; }
    }
    echo "</pre>";
    exit;
});

// ── Diagnóstico PHP (acesso local apenas) ───────────────────────────────────
$router->get('/phpdiag', function(): void {
    if (!in_array($_SERVER['REMOTE_ADDR'] ?? '', ['127.0.0.1', '::1'])) {
        http_response_code(403); exit('Acesso negado');
    }
    header('Content-Type: text/plain; charset=utf-8');
    echo "OPCACHE: " . (function_exists('opcache_get_status') ? json_encode(opcache_get_status(false)) : 'nao disponivel') . "\n\n";

    $extDir   = ini_get('extension_dir');
    $phpIni   = php_ini_loaded_file();
    $exts     = get_loaded_extensions();
    sort($exts);

    $fbLocais = [
        $extDir . DIRECTORY_SEPARATOR . 'fbclient.dll',
        dirname(PHP_BINARY)  . DIRECTORY_SEPARATOR . 'fbclient.dll',
        dirname($extDir)     . DIRECTORY_SEPARATOR . 'fbclient.dll',
        'C:\Windows\System32\fbclient.dll',
        dirname($extDir)     . DIRECTORY_SEPARATOR . 'zlib1.dll',
        dirname(PHP_BINARY)  . DIRECTORY_SEPARATOR . 'zlib1.dll',
    ];

    echo "=== DIAGNOSTICO PHP - Premium Express Gestão ===\n\n";
    echo "PHP versao     : " . PHP_VERSION . "\n";
    echo "PHP binario    : " . PHP_BINARY . "\n";
    echo "php.ini carregado: " . ($phpIni ?: 'NENHUM') . "\n";
    echo "extension_dir  : " . $extDir . "\n";
    echo "extension_dir existe: " . (is_dir($extDir) ? 'SIM' : 'NAO') . "\n\n";

    echo "--- pdo_firebird carregado: " . (extension_loaded('pdo_firebird') ? 'SIM' : 'NAO') . " ---\n\n";

    echo "--- Extensoes carregadas (" . count($exts) . ") ---\n";
    echo implode(', ', $exts) . "\n\n";

    echo "--- Arquivos DLL ---\n";
    foreach ($fbLocais as $f) {
        echo (file_exists($f) ? '[OK] ' : '[FALTA] ') . $f . "\n";
    }

    echo "\n--- PATH do processo ---\n";
    echo getenv('PATH') . "\n";
    exit;
});

// ── Diagnóstico de diferença de faturamento vs concorrente ──────────────────
$router->get('/debug-vendas', function(): void {
    header('Content-Type: text/html; charset=utf-8');
    $pdo = \App\Core\Database::conectar();

    $ini = $_GET['ini'] ?? '2026-01-01';
    $fim = $_GET['fim'] ?? '2026-05-20';

    // Filtra empresa da config
    $codEmpresa = null;
    try {
        $cfg = require dirname(__DIR__) . '/config/database.php';
        if (!empty($cfg['cod_empresa'])) $codEmpresa = (int)$cfg['cod_empresa'];
    } catch (\Throwable) {}
    $fe = $codEmpresa ? "AND nc.COD_EMPRESA = {$codEmpresa}" : '';

    // Carrega tipos de venda válidos (nossa lógica atual)
    $tiposIn = '';
    try {
        $rows = $pdo->query("
            SELECT DISTINCT COD_TIPO_OPERACAO FROM TIPO_OPERACAO
            WHERE TIPO_NATUREZA = 'V'
              AND COD_TIPO_OPERACAO NOT IN (
                  SELECT COD_TIPO_OPERACAO FROM TIPO_OPERACAO
                  WHERE DEVOLUCAO = 'S' OR ETRANSF = 'S' OR MOV_INTERNA = 'S'
              )
        ")->fetchAll(\PDO::FETCH_COLUMN);
        $tiposIn = implode(',', array_map('intval', $rows));
    } catch (\Throwable $e) { $tiposIn = ''; }

    $fv = $tiposIn ? "AND nc.COD_TIPO_OPERACAO IN ({$tiposIn})" : '';

    // Query A: bruto (sem filtroVenda)
    $rA = $pdo->query("
        SELECT COALESCE(SUM(CASE WHEN nc.TOTAL_NOTA > 0 THEN nc.TOTAL_NOTA ELSE 0 END),0) AS TOTAL,
               COUNT(CASE WHEN nc.TOTAL_NOTA > 0 THEN 1 END) AS QTD
        FROM NOTAS_CAB nc
        WHERE nc.DATA_EMISSAO >= '{$ini}' AND nc.DATA_EMISSAO < DATEADD(DAY,1,CAST('{$fim}' AS DATE))
          AND nc.DATA_CANC IS NULL {$fe}
    ")->fetch(\PDO::FETCH_ASSOC);

    // Query B: com filtroVenda (nosso sistema atual)
    $rB = $pdo->query("
        SELECT COALESCE(SUM(CASE WHEN nc.TOTAL_NOTA > 0 THEN nc.TOTAL_NOTA ELSE 0 END),0) AS TOTAL,
               COUNT(CASE WHEN nc.TOTAL_NOTA > 0 THEN 1 END) AS QTD
        FROM NOTAS_CAB nc
        WHERE nc.DATA_EMISSAO >= '{$ini}' AND nc.DATA_EMISSAO < DATEADD(DAY,1,CAST('{$fim}' AS DATE))
          AND nc.DATA_CANC IS NULL {$fe} {$fv}
    ")->fetch(\PDO::FETCH_ASSOC);

    // Query C: sem filtrar DATA_CANC, com COD_SITUACAO <> 3
    $rC = $pdo->query("
        SELECT COALESCE(SUM(CASE WHEN nc.TOTAL_NOTA > 0 THEN nc.TOTAL_NOTA ELSE 0 END),0) AS TOTAL,
               COUNT(CASE WHEN nc.TOTAL_NOTA > 0 THEN 1 END) AS QTD
        FROM NOTAS_CAB nc
        WHERE nc.DATA_EMISSAO >= '{$ini}' AND nc.DATA_EMISSAO < DATEADD(DAY,1,CAST('{$fim}' AS DATE))
          AND nc.COD_SITUACAO <> 3 {$fe} {$fv}
    ")->fetch(\PDO::FETCH_ASSOC);

    // Query D: breakdown por TIPO_OPERACAO
    $rD = $pdo->query("
        SELECT FIRST 40
            nc.COD_TIPO_OPERACAO,
            TRIM(COALESCE(t.DESCRICAO,'?')) AS DESCRICAO,
            t.TIPO_NATUREZA,
            t.DEVOLUCAO,
            t.ETRANSF,
            t.MOV_INTERNA,
            COUNT(*) AS QTD,
            COALESCE(SUM(CASE WHEN nc.TOTAL_NOTA > 0 THEN nc.TOTAL_NOTA ELSE 0 END),0) AS TOTAL
        FROM NOTAS_CAB nc
        LEFT JOIN TIPO_OPERACAO t ON t.COD_TIPO_OPERACAO = nc.COD_TIPO_OPERACAO
        WHERE nc.DATA_EMISSAO >= '{$ini}' AND nc.DATA_EMISSAO < DATEADD(DAY,1,CAST('{$fim}' AS DATE))
          AND nc.DATA_CANC IS NULL {$fe}
          AND nc.TOTAL_NOTA > 0
        GROUP BY nc.COD_TIPO_OPERACAO, TRIM(COALESCE(t.DESCRICAO,'?')), t.TIPO_NATUREZA, t.DEVOLUCAO, t.ETRANSF, t.MOV_INTERNA
        ORDER BY TOTAL DESC
    ")->fetchAll(\PDO::FETCH_ASSOC);

    $fmt = fn($v) => 'R$ ' . number_format((float)$v, 2, ',', '.');
    $fire = 6828802.71; // valor do concorrente — ajuste conforme necessário
    $dif  = fn($v) => round($fire - (float)$v, 2);

    echo '<!DOCTYPE html><html><head><meta charset="utf-8">
    <title>Debug Faturamento</title>
    <style>body{font-family:monospace;background:#0d0f14;color:#e2e8f0;padding:2rem}
    h2{color:#4f8ef7}table{border-collapse:collapse;width:100%;margin:1rem 0}
    th{background:#1e2130;color:#7dd3fc;padding:.5rem 1rem;text-align:left}
    td{padding:.4rem 1rem;border-bottom:1px solid #1e2130}
    .ok{color:#4ade80}.bad{color:#f87171}.diff{color:#fbbf24}
    </style></head><body>';

    echo "<h2>Diagnóstico de Faturamento — {$ini} a {$fim}</h2>";
    echo "<p>COD_EMPRESA: <b>" . ($codEmpresa ?? 'sem filtro') . "</b> | filtroVenda tipos: <b>" . ($tiposIn ?: 'NENHUM') . "</b></p>";
    echo "<p>Fire Sistemas (referência): <b>{$fmt($fire)}</b></p>";
    echo "<table><tr><th>Query</th><th>Total</th><th>Qtd notas</th><th>Dif vs Fire</th><th>Ticket</th></tr>";

    foreach ([
        ['A — Bruto (sem filtroVenda, DATA_CANC IS NULL)', $rA],
        ['B — Nosso sistema atual (com filtroVenda, DATA_CANC IS NULL)', $rB],
        ['C — Com filtroVenda, COD_SITUACAO <> 3 (sem DATA_CANC)', $rC],
    ] as [$label, $r]) {
        $tot  = (float)($r['TOTAL'] ?? 0);
        $qtd  = (int)($r['QTD'] ?? 0);
        $diff = $dif($tot);
        $tk   = $qtd > 0 ? $tot / $qtd : 0;
        $cls  = abs($diff) < 100 ? 'ok' : (abs($diff) < 5000 ? 'diff' : 'bad');
        echo "<tr><td>{$label}</td><td>{$fmt($tot)}</td><td>{$qtd}</td>
              <td class='{$cls}'>" . ($diff >= 0 ? "+{$fmt($diff)}" : "-{$fmt(abs($diff))}") . " Fire</td>
              <td>{$fmt($tk)}</td></tr>";
    }
    echo "</table>";

    echo "<h2>Breakdown por TIPO_OPERACAO (DATA_CANC IS NULL, sem filtroVenda)</h2>";
    echo "<table><tr><th>COD</th><th>Descricao</th><th>Natureza</th><th>DEV</th><th>ETR</th><th>MOV_INT</th><th>Qtd</th><th>Total</th><th>Incluído?</th></tr>";
    $tiposArr = $tiposIn ? array_map('intval', explode(',', $tiposIn)) : [];
    foreach ($rD as $row) {
        $cod = (int)$row['COD_TIPO_OPERACAO'];
        $inc = $tiposIn === '' ? '(sem filtro)' : (in_array($cod, $tiposArr) ? '<span class="ok">SIM</span>' : '<span class="bad">NÃO</span>');
        echo "<tr>
            <td>{$cod}</td>
            <td>" . htmlspecialchars((string)$row['DESCRICAO']) . "</td>
            <td>{$row['TIPO_NATUREZA']}</td>
            <td>{$row['DEVOLUCAO']}</td>
            <td>{$row['ETRANSF']}</td>
            <td>{$row['MOV_INTERNA']}</td>
            <td>{$row['QTD']}</td>
            <td>{$fmt($row['TOTAL'])}</td>
            <td>{$inc}</td>
        </tr>";
    }
    echo "</table></body></html>";
    exit;
});


// ── Rota 404 personalizada ───────────────────────────────────────────────────
$router->setNotFound(function (): void {
    echo '<div style="font-family:sans-serif;text-align:center;padding:4rem;color:#e2e8f0;background:#0d0f14;min-height:100vh;">';
    echo '<h1 style="font-size:4rem;color:#4f8ef7;">404</h1>';
    echo '<p>Página não encontrada.</p>';
    echo '<a href="/" style="color:#4f8ef7;">← Voltar ao início</a>';
    echo '</div>';
});

// ── Guard global: login obrigatório em todas as rotas ───────────────────────
// Rotas públicas que não exigem autenticação
$_rotasPublicas = [
    '/admin/login',
    '/admin/autenticar',
    '/admin/setup',
    '/admin/setup/salvar',
    '/admin/logout',
    '/admin/reauth',            // confirmação de senha para config
    '/admin/reauth/confirmar',  // processa confirmação
    '/personalizar',            // tema livre para todos
    '/set-tema',                // salvar tema sem login
    '/login',                   // login Firebird
    '/autenticar',              // processa login Firebird
    '/logout',                  // logout Firebird
    '/sem-permissao',           // pagina de acesso negado
];
$_uriAtual = parse_url($_SERVER['REQUEST_URI'] ?? '/', PHP_URL_PATH);
if (!in_array($_uriAtual, $_rotasPublicas, true)
    && !str_starts_with($_uriAtual, '/leitor')          // leitor tem auth própria via PIN
    && !str_starts_with($_uriAtual, '/atualizacoes')    // servidor de atualização (manifesto/pacote públicos)
    && !(                                                 // APIs usadas pelo leitor (sessão leitor ativa)
        !empty($_SESSION['leitor_ok'])
        && (
            str_starts_with($_uriAtual, '/api/produtos/')
            || str_starts_with($_uriAtual, '/api/leitor/')
        )
    )
    && !\App\Core\FbAuth::estaLogado()                  // usuario autenticado via Firebird nao precisa de admin
) {
    \App\Core\Auth::verificarOuRedirecionar();
}
unset($_rotasPublicas, $_uriAtual);

// ── Executa a aplicação ──────────────────────────────────────────────────────
$app->run();
