<?php
// =====================================================================
// Depto de Engenharia e Automação - Master Automação - Autor: Derlivon Silva
// =====================================================================
// Página de diagnóstico — usada quando pdo_firebird não carrega.
// Acesse: http://localhost:8000/__diag.php
// Mostra:
//   - Versão PHP, php.ini ativo, extension_dir
//   - extension=pdo_firebird ATIVO ou comentado?
//   - DLLs em php\ext\, php\, Apache24\bin\ — quais existem
//   - Tentativa de instanciar PDO Firebird e ver erro REAL
// Texto puro pro cliente conseguir copiar pro suporte.
// =====================================================================
header('Content-Type: text/plain; charset=utf-8');

function tem($p) { return file_exists($p) ? 'EXISTE' : 'FALTA'; }
function tam($p) { return file_exists($p) ? filesize($p).' bytes' : '-'; }

echo "==========================================================\n";
echo "  DIAGNOSTICO Premium Express Gestão - " . date('Y-m-d H:i:s') . "\n";
echo "==========================================================\n\n";

echo "[1] PHP\n";
echo "  Versao:        " . PHP_VERSION . "\n";
echo "  SAPI:          " . PHP_SAPI . "\n";
echo "  Built:         " . (defined('PHP_BUILD_DATE') ? PHP_BUILD_DATE : '?') . "\n";
echo "  ini_loaded:    " . (php_ini_loaded_file() ?: '(nenhum)') . "\n";
echo "  extension_dir: " . ini_get('extension_dir') . "\n";
echo "  PHP runtime:   " . (function_exists('zend_version') ? zend_version() : '?') . "\n\n";

echo "[2] PDO\n";
echo "  Drivers: [" . implode(',', PDO::getAvailableDrivers()) . "]\n";
echo "  pdo_firebird loaded?  " . (extension_loaded('pdo_firebird') ? 'SIM' : 'NAO') . "\n";
echo "  interbase loaded?     " . (extension_loaded('interbase') ? 'SIM' : 'NAO') . "\n\n";

// [3] PHP.INI - linhas relevantes
echo "[3] LINHAS RELEVANTES DO PHP.INI\n";
$iniPath = php_ini_loaded_file();
if ($iniPath && file_exists($iniPath)) {
    $linhas = file($iniPath, FILE_IGNORE_NEW_LINES);
    $padroes = ['extension_dir','extension=pdo','extension=interbase','extension=fbird','date.timezone','session.save_path','error_log'];
    foreach ($linhas as $n => $l) {
        $t = strtolower(trim($l));
        if ($t === '' || $t[0] === ';' && !preg_match('/extension\s*=/', $t)) continue;
        foreach ($padroes as $p) {
            if (stripos($l, $p) !== false) { echo sprintf("  L%4d: %s\n", $n+1, $l); break; }
        }
    }
} else {
    echo "  (php.ini nao encontrado)\n";
}
echo "\n";

// [4] DLLs criticas
// __DIR__ = ...\app\public  => $appDir = ...\app  => $rootDir = ...\<root da instalacao>
// Sobe ate achar uma pasta que contenha php\ext\
$candidato = dirname(__DIR__);
$rootDir = null;
for ($i = 0; $i < 5; $i++) {
    if (is_dir($candidato . '/php/ext')) { $rootDir = $candidato; break; }
    $up = dirname($candidato);
    if ($up === $candidato) break;
    $candidato = $up;
}
if (!$rootDir) $rootDir = dirname(dirname(__DIR__)); // fallback: 2 niveis acima
echo "  rootDir detectado: $rootDir\n";
$ext    = $rootDir . '/php/ext';
$php    = $rootDir . '/php';
$bin    = $rootDir . '/Apache24/bin';

echo "[4] DLLs CRITICAS\n";
echo "  Pasta: $ext\n";
foreach (['php_pdo.dll','php_pdo_firebird.dll','php_pdo_mysql.dll'] as $d) {
    printf("    %-30s %-8s  %s\n", $d, tem("$ext/$d"), tam("$ext/$d"));
}
echo "  Pasta: $php\n";
foreach (['php.exe','php8.dll','php8apache2_4.dll','php8ts.dll','fbclient.dll','zlib1.dll','vcruntime140.dll','vcruntime140_1.dll','msvcp140.dll','firebird.conf'] as $d) {
    printf("    %-30s %-8s  %s\n", $d, tem("$php/$d"), tam("$php/$d"));
}
echo "  Pasta: $bin\n";
foreach (['httpd.exe','fbclient.dll','zlib1.dll','vcruntime140.dll','vcruntime140_1.dll','msvcp140.dll','php8apache2_4.dll','firebird.conf'] as $d) {
    printf("    %-30s %-8s  %s\n", $d, tem("$bin/$d"), tam("$bin/$d"));
}
echo "\n";

// [5] VC++ em System32
echo "[5] VC++ Runtime em System32\n";
foreach (['vcruntime140.dll','vcruntime140_1.dll','msvcp140.dll'] as $d) {
    printf("    %-30s %s\n", $d, tem("C:/Windows/System32/$d"));
}
echo "\n";

// [6a] Roda php.exe na linha de comando e captura erro de carregamento de DLL.
// Isso revela o erro REAL que o PHP esconde quando carrega extension via apache2handler.
echo "[6a] EXECUTANDO php.exe -m (revela erro REAL de DLL load)\n";
$phpExe = $rootDir . '/php/php.exe';
if (file_exists($phpExe)) {
    $out = shell_exec('"' . $phpExe . '" -d display_errors=1 -d display_startup_errors=1 -m 2>&1');
    echo "  ---inicio do output---\n";
    foreach (preg_split("/\r?\n/", trim($out)) as $linha) {
        echo "    $linha\n";
    }
    echo "  ---fim do output---\n";
    // tenta -i tb pra ver Loaded Configuration File E o PHP API
    $info = shell_exec('"' . $phpExe . '" -d display_errors=1 -i 2>&1 | findstr /R "API.*Date Loaded.Configuration Thread.*Safety pdo_firebird"');
    if ($info) {
        echo "  ---php.exe -i (linhas relevantes)---\n";
        foreach (preg_split("/\r?\n/", trim($info)) as $linha) {
            echo "    $linha\n";
        }
    }
} else {
    echo "  php.exe nao encontrado em $phpExe\n";
}
echo "\n";

// [6b] Tenta carregar a DLL via dl() (deprecated mas pode dar info)
echo "[6b] TENTATIVA DE CARREGAR pdo_firebird DINAMICAMENTE\n";
if (function_exists('dl')) {
    error_reporting(E_ALL);
    @ini_set('display_errors', '1');
    $ok = @dl('php_pdo_firebird.dll');
    echo "  dl() result: " . ($ok ? 'OK' : 'FAIL') . "\n";
    if (!$ok) {
        $err = error_get_last();
        echo "  error_get_last: " . print_r($err, true) . "\n";
    }
} else {
    echo "  dl() nao esta disponivel (PHP_SAPI=" . PHP_SAPI . ")\n";
}
echo "\n";

// [7] Tenta conexao real
echo "[7] TENTATIVA DE NEW PDO('firebird:...')\n";
// Procura database.php em 2 locais possiveis
$cfgPath1 = dirname(__DIR__) . '/config/database.php';     // app\config\database.php
$cfgPath2 = $rootDir . '/config/database.php';             // <root>\config\database.php
$cfg = file_exists($cfgPath1) ? @include $cfgPath1 : (file_exists($cfgPath2) ? @include $cfgPath2 : null);
$cfgPath = file_exists($cfgPath1) ? $cfgPath1 : (file_exists($cfgPath2) ? $cfgPath2 : 'NAO ENCONTRADO');
echo "  database.php em: $cfgPath\n";
if (is_array($cfg)) {
    $dsn = "firebird:dbname={$cfg['host']}/{$cfg['port']}:{$cfg['database']};charset={$cfg['charset']}";
    echo "  DSN: $dsn\n";
    try {
        $pdo = new PDO($dsn, $cfg['username'], $cfg['password'], [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]);
        echo "  CONEXAO: OK\n";
    } catch (Throwable $e) {
        echo "  CONEXAO FALHOU: " . $e->getMessage() . "\n";
    }
} else {
    echo "  (config nao encontrado em $cfgPath1 nem em $cfgPath2)\n";
}
echo "\n";

echo "==========================================================\n";
echo "  FIM DO DIAGNOSTICO - copie esse texto e mande pro suporte\n";
echo "==========================================================\n";
