<?php
// Diagnóstico - acesso local apenas
if (!in_array($_SERVER['REMOTE_ADDR'] ?? '', ['127.0.0.1', '::1', '::ffff:127.0.0.1'])) {
    http_response_code(403); exit;
}
header('Content-Type: text/plain; charset=utf-8');

$extDir  = ini_get('extension_dir');
$phpDir  = dirname(PHP_BINARY);
$appDir  = dirname($phpDir); // pai de php/

echo "=== DIAGNOSTICO PHP ===\n\n";
echo "PHP versao       : " . PHP_VERSION . "\n";
echo "PHP binario      : " . PHP_BINARY  . "\n";
echo "php.ini carregado: " . (php_ini_loaded_file() ?: 'NENHUM - CRITICO!') . "\n";
echo "extension_dir    : " . $extDir . "\n";
echo "extension_dir OK : " . (is_dir($extDir) ? 'SIM' : 'NAO - ERRO!') . "\n\n";

echo "pdo_firebird     : " . (extension_loaded('pdo_firebird') ? 'CARREGADO OK' : 'NAO CARREGADO') . "\n";
echo "pdo              : " . (extension_loaded('pdo')          ? 'OK' : 'NAO') . "\n";
echo "mbstring         : " . (extension_loaded('mbstring')     ? 'OK' : 'NAO') . "\n\n";

echo "--- Todos os modulos carregados ---\n";
$exts = get_loaded_extensions(); sort($exts);
echo implode(', ', $exts) . "\n\n";

echo "--- Arquivos DLL em ext/ ---\n";
$checks = [
    $extDir . '\fbclient.dll',
    $extDir . '\zlib1.dll',
    $extDir . '\msvcr100.dll',
    $extDir . '\vcruntime140.dll',
    $phpDir . '\fbclient.dll',
    $phpDir . '\zlib1.dll',
    'C:\Windows\System32\fbclient.dll',
    'C:\Windows\System32\zlib1.dll',
    'C:\Windows\System32\msvcr100.dll',
    'C:\Windows\System32\vcruntime140.dll',
];
foreach ($checks as $f) {
    echo ($exists = file_exists($f) ? '[OK]    ' : '[FALTA] ') . $f . "\n";
}

// ── deplister.exe — mostra dependências exatas das DLLs ─────────────────────
echo "\n--- deplister: php_pdo_firebird.dll ---\n";
$deplister = $phpDir . '\deplister.exe';
$pdofb     = $extDir . '\php_pdo_firebird.dll';
if (file_exists($deplister) && file_exists($pdofb)) {
    $out = shell_exec('"' . $deplister . '" "' . $pdofb . '" 2>&1');
    echo $out ?: "(sem saida)\n";
} else {
    echo "[AVISO] deplister.exe ou php_pdo_firebird.dll nao encontrado\n";
}

echo "\n--- deplister: fbclient.dll (em ext/) ---\n";
$fbExt = $extDir . '\fbclient.dll';
if (file_exists($deplister) && file_exists($fbExt)) {
    $out = shell_exec('"' . $deplister . '" "' . $fbExt . '" 2>&1');
    echo $out ?: "(sem saida)\n";
} else {
    echo "[AVISO] fbclient.dll nao encontrado em ext/\n";
}

// ── PHP -m (lista extensoes pelo CLI, captura warnings de falha) ─────────────
echo "\n--- php -m (extensoes pelo CLI) ---\n";
$phpIni = php_ini_loaded_file();
$cmd    = '"' . PHP_BINARY . '" -c "' . $phpIni . '" -m 2>&1';
$out    = shell_exec($cmd);
echo $out ?: "(sem saida)\n";

// ── Log de erros do PHP ──────────────────────────────────────────────────────
echo "\n--- Log de erros PHP (ultimas 40 linhas) ---\n";
$logFile = ini_get('error_log');
if ($logFile && file_exists($logFile)) {
    $lines = file($logFile);
    $last  = array_slice($lines, -40);
    echo implode('', $last);
} else {
    echo "Log nao encontrado: " . ($logFile ?: 'nao configurado') . "\n";
}

echo "\n--- PATH do processo PHP ---\n";
$path = getenv('PATH') ?: 'nao disponivel';
foreach (explode(';', $path) as $p) {
    if (trim($p)) echo "  " . trim($p) . "\n";
}

// ── Diagnóstico banco: tabelas relacionadas a mesas e itens ─────────────────
echo "\n=== DIAGNOSTICO BANCO (tabelas de mesas/itens) ===\n";
$cfgFile = dirname(__DIR__) . '/config/database.php';
if (!file_exists($cfgFile)) {
    echo "[AVISO] config/database.php nao encontrado\n";
} elseif (!extension_loaded('pdo_firebird')) {
    echo "[AVISO] pdo_firebird nao carregado — impossivel conectar\n";
} else {
    $cfg = require $cfgFile;
    try {
        $dsn = ($cfg['tipo'] ?? 'remota') === 'local'
            ? "firebird:dbname={$cfg['database']};charset={$cfg['charset']}"
            : "firebird:dbname={$cfg['host']}/{$cfg['port']}:{$cfg['database']};charset={$cfg['charset']}";
        $pdo = new PDO($dsn, $cfg['username'], $cfg['password'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
        echo "[OK] Conexao estabelecida\n\n";

        // Lista tabelas que contém MESA, ITEM, COMANDA, PEDIDO no nome
        $sql = "SELECT TRIM(RDB\$RELATION_NAME) T FROM RDB\$RELATIONS
                WHERE RDB\$SYSTEM_FLAG=0 AND RDB\$VIEW_BLR IS NULL
                  AND (UPPER(TRIM(RDB\$RELATION_NAME)) LIKE '%MESA%'
                    OR UPPER(TRIM(RDB\$RELATION_NAME)) LIKE '%ITEM%'
                    OR UPPER(TRIM(RDB\$RELATION_NAME)) LIKE '%COMANDA%'
                    OR UPPER(TRIM(RDB\$RELATION_NAME)) LIKE '%PEDIDO%')
                ORDER BY 1";
        $tabelas = $pdo->query($sql)->fetchAll(PDO::FETCH_COLUMN);
        echo "Tabelas encontradas (" . count($tabelas) . "):\n";
        foreach ($tabelas as $t) echo "  - $t\n";

        // Colunas de ABERT_MESA
        echo "\nColunas de ABERT_MESA:\n";
        $cols = $pdo->query("SELECT TRIM(rf.RDB\$FIELD_NAME) C FROM RDB\$RELATION_FIELDS rf
            WHERE TRIM(rf.RDB\$RELATION_NAME)='ABERT_MESA' ORDER BY rf.RDB\$FIELD_POSITION")->fetchAll(PDO::FETCH_COLUMN);
        foreach ($cols as $c) echo "  - $c\n";

        // Amostra de uma mesa aberta (STATUS='A') com todos campos de valor
        echo "\nAmostra ABERT_MESA (STATUS=A, FIRST 3):\n";
        $rows = $pdo->query("SELECT FIRST 3 COD_ABERTURA,COD_MESA,STATUS,TOTAL_ITENS,
            TOTAL_AVISTA,TOTA_APRAZO,TOTAL_CHEQUE,TOTAL_CARTAO,TX_SERVICO
            FROM ABERT_MESA WHERE STATUS='A'")->fetchAll(PDO::FETCH_ASSOC);
        if ($rows) {
            foreach ($rows as $r) {
                foreach ($r as $k => $v) echo "  $k=" . (is_null($v) ? 'NULL' : $v) . " ";
                echo "\n";
            }
        } else {
            echo "  (sem mesas abertas)\n";
        }

        // Se existir ITENS_ABERT_MESA, mostra estrutura
        foreach (['ITENS_ABERT_MESA','ABERT_MESA_ITENS','ITENS_COMANDA','COMANDA_ITENS','PEDIDOS_ITENS'] as $tb) {
            try {
                $cnt = $pdo->query("SELECT COUNT(*) FROM \"$tb\"")->fetchColumn();
                $cols2 = $pdo->query("SELECT TRIM(rf.RDB\$FIELD_NAME) C FROM RDB\$RELATION_FIELDS rf
                    WHERE TRIM(rf.RDB\$RELATION_NAME)='$tb' ORDER BY rf.RDB\$FIELD_POSITION")->fetchAll(PDO::FETCH_COLUMN);
                echo "\nTabela $tb existe! ($cnt registros)\nColunas: " . implode(', ', $cols2) . "\n";
                // amostra 2 linhas
                $sample = $pdo->query("SELECT FIRST 2 * FROM \"$tb\"")->fetchAll(PDO::FETCH_ASSOC);
                foreach ($sample as $row) {
                    foreach ($row as $k => $v) echo "  $k=" . (is_null($v) ? 'NULL' : $v) . " ";
                    echo "\n";
                }
            } catch (Throwable) {}
        }

    } catch (Throwable $e) {
        echo "[ERRO] " . $e->getMessage() . "\n";
    }
}
