<?php
/**
 * INSTALADOR mPDF v3 — força PHP CLI (não php-cgi)
 * Upload para: sistema/instalar_mpdf3.php
 * Acesse: https://sistema.brenopaiva.com.br/instalar_mpdf3.php
 * APAGUE após instalar!
 */
set_time_limit(600);
ini_set('memory_limit', '512M');
ignore_user_abort(true);

@ini_set('output_buffering', 'off');
@ini_set('zlib.output_compression', false);
while (@ob_end_flush());

function out($msg, $tipo = 'info') {
    $cores = ['ok'=>'#2ecc71','err'=>'#e74c3c','warn'=>'#f39c12','info'=>'#3498db','h'=>'#fff'];
    echo '<div style="color:'.($cores[$tipo]??'#ccc').';padding:2px 0;font-family:monospace;font-size:13px">'.$msg.'</div>';
    flush(); ob_flush();
}

echo '<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Instalador mPDF v3</title>
<style>body{background:#0d1117;color:#e6edf3;padding:20px;max-width:900px;margin:0 auto;font-family:monospace}
pre{background:#161b22;border:1px solid #30363d;padding:15px;border-radius:6px;white-space:pre-wrap;font-size:12px;max-height:500px;overflow-y:auto}
.box{background:#161b22;border:1px solid #30363d;border-radius:8px;padding:16px;margin:10px 0}
h1{color:#58a6ff}</style></head><body>
<h1>🔧 Instalador mPDF v3</h1><div class="box">';

$base = __DIR__;
$phar = $base . '/composer.phar';
$vendor = $base . '/vendor';

// Verificar se já está instalado
if (file_exists($vendor.'/autoload.php') && is_dir($vendor.'/mpdf/mpdf')) {
    out('✅ <strong>mPDF já está instalado!</strong>', 'ok');
    out('Instale o dompdf_helper.php e apague este arquivo.', 'info');
    echo '</div></body></html>'; exit;
}

// ── Encontrar o PHP CLI correto ──────────────────────────────
out('<strong>🔍 Localizando PHP CLI...</strong>', 'h');

$php_cgi = PHP_BINARY; // provavelmente php-cgi
out('PHP atual (CGI): ' . $php_cgi, 'warn');

// Lista de caminhos CLI a tentar, do mais específico ao genérico
$php_candidatos = [
    // cPanel EasyApache 8.1 (confirmado pelo diagnóstico)
    '/opt/cpanel/ea-php81/root/usr/bin/php',
    // Variações comuns
    str_replace('php-cgi', 'php', $php_cgi),
    str_replace('-cgi', '', $php_cgi),
    '/usr/local/bin/php',
    '/usr/bin/php',
    '/usr/bin/php8.1',
    '/usr/bin/php81',
    '/opt/cpanel/ea-php81/root/usr/bin/php8.1',
];

$php_cli = null;
foreach ($php_candidatos as $candidato) {
    if (file_exists($candidato) && is_executable($candidato)) {
        // Testa se realmente é CLI (não CGI)
        $teste = shell_exec(escapeshellarg($candidato) . ' -r "echo PHP_SAPI;" 2>&1');
        if (trim($teste) === 'cli') {
            $php_cli = $candidato;
            out('✓ PHP CLI encontrado: ' . $php_cli, 'ok');
            break;
        } else {
            out('⚠ ' . $candidato . ' → SAPI: ' . trim($teste), 'warn');
        }
    }
}

if (!$php_cli) {
    out('', 'info');
    out('❌ PHP CLI não encontrado nos caminhos padrão.', 'err');
    out('Tentando descobrir via "which" e "find"...', 'warn');

    $which = trim(shell_exec('which php php8.1 php81 2>/dev/null') ?? '');
    if ($which) out('which encontrou: ' . $which, 'info');

    $find = trim(shell_exec('find /opt/cpanel -name "php" -not -name "php-cgi" -type f 2>/dev/null | head -5') ?? '');
    if ($find) {
        out('find encontrou:', 'info');
        foreach (explode("\n", $find) as $f) {
            $f = trim($f);
            if (!$f) continue;
            out('  ' . $f, 'info');
            $teste = shell_exec(escapeshellarg($f) . ' -r "echo PHP_SAPI;" 2>&1');
            if (trim($teste) === 'cli') {
                $php_cli = $f;
                out('  ✓ Este é CLI!', 'ok');
                break;
            }
        }
    }
}

if (!$php_cli) {
    out('', 'info');
    out('❌ Não foi possível localizar o PHP CLI automaticamente.', 'err');
    out('Cole o caminho do PHP CLI abaixo e me envie.', 'warn');
    echo '</div><div class="box">';
    $paths = shell_exec('find /opt/cpanel /usr/local/bin /usr/bin -name "php*" -type f 2>/dev/null | sort | head -20');
    echo '<pre>' . htmlspecialchars($paths ?? 'Nenhum resultado') . '</pre>';
    echo '</div></body></html>'; exit;
}

// ── Verificar composer.json ──────────────────────────────────
out('', 'info');
out('<strong>📄 composer.json</strong>', 'h');
$cjson = $base . '/composer.json';
if (!file_exists($cjson)) {
    file_put_contents($cjson, json_encode([
        'require' => ['mpdf/mpdf' => '^8.2'],
        'config'  => ['optimize-autoloader' => true]
    ], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
    out('✓ Criado', 'ok');
} else {
    $j = json_decode(file_get_contents($cjson), true);
    if (empty($j['require']['mpdf/mpdf'])) {
        $j['require']['mpdf/mpdf'] = '^8.2';
        file_put_contents($cjson, json_encode($j, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
        out('✓ mpdf adicionado', 'ok');
    } else {
        out('✓ mpdf já está no composer.json', 'ok');
    }
}

// ── Verificar composer.phar ──────────────────────────────────
out('', 'info');
out('<strong>📦 Composer</strong>', 'h');
if (!file_exists($phar)) {
    out('Baixando composer.phar...', 'info');
    $ch = curl_init('https://getcomposer.org/composer-stable.phar');
    curl_setopt_array($ch, [CURLOPT_RETURNTRANSFER=>true,CURLOPT_FOLLOWLOCATION=>true,CURLOPT_SSL_VERIFYPEER=>false,CURLOPT_TIMEOUT=>120,CURLOPT_USERAGENT=>'Composer-Installer']);
    $data = curl_exec($ch); curl_close($ch);
    if ($data) { file_put_contents($phar, $data); chmod($phar, 0755); out('✓ Baixado ('.round(filesize($phar)/1024).'KB)', 'ok'); }
    else { out('✗ Falha ao baixar Composer', 'err'); echo '</div></body></html>'; exit; }
} else {
    out('✓ composer.phar já existe ('.round(filesize($phar)/1024).'KB)', 'ok');
}

// ── Instalar mPDF com PHP CLI ────────────────────────────────
out('', 'info');
out('<strong>⚙️ Instalando mPDF com PHP CLI</strong>', 'h');

$cmd = escapeshellarg($php_cli) . ' ' . escapeshellarg($phar)
     . ' require mpdf/mpdf --no-interaction --no-progress --no-ansi --optimize-autoloader'
     . ' --working-dir=' . escapeshellarg($base) . ' 2>&1';

out('Comando: <small>' . htmlspecialchars($cmd) . '</small>', 'info');
out('⏳ Instalando... aguarde (2-5 min)', 'warn');
echo '</div><div class="box"><pre>';
flush(); ob_flush();

$home_dir = $base . '/.composer_home';
if (!is_dir($home_dir)) mkdir($home_dir, 0775, true);

$desc = [0=>['pipe','r'], 1=>['pipe','w'], 2=>['pipe','w']];
$env  = array_merge($_ENV ?: [], ['COMPOSER_HOME' => $home_dir, 'HOME' => $home_dir]);
$proc = proc_open($cmd, $desc, $pipes, $base, $env);

$ok = false;
if ($proc) {
    fclose($pipes[0]);
    stream_set_blocking($pipes[1], false);
    stream_set_blocking($pipes[2], false);
    $deadline = time() + 300;
    while (time() < $deadline) {
        $o = fgets($pipes[1]); $e = fgets($pipes[2]);
        if ($o !== false && $o !== '') { echo htmlspecialchars($o); flush(); ob_flush(); }
        if ($e !== false && $e !== '') { echo htmlspecialchars($e); flush(); ob_flush(); }
        if (feof($pipes[1]) && feof($pipes[2])) break;
        usleep(200000);
    }
    fclose($pipes[1]); fclose($pipes[2]);
    $exit = proc_close($proc);
    $ok = ($exit === 0);
} else {
    echo 'proc_open falhou';
}

echo '</pre></div><div class="box">';

if ($ok && file_exists($vendor.'/autoload.php') && is_dir($vendor.'/mpdf/mpdf')) {
    out('✅ <strong>mPDF instalado com sucesso!</strong>', 'ok');
    out('', 'info');
    out('🎯 PRÓXIMOS PASSOS:', 'h');
    out('1. Suba: dompdf_helper.php → application/helpers/dompdf_helper.php', 'info');
    out('2. ⚠ APAGUE este arquivo (instalar_mpdf3.php) do servidor!', 'warn');
    out('3. Teste gerando um PDF no sistema', 'info');
} else {
    out('❌ Instalação falhou. Veja a saída acima.', 'err');
    out('', 'info');
    out('Se aparecer erro de rede/download, o servidor pode bloquear conexões externas durante proc_open.', 'warn');
    out('Nesse caso: instale o mPDF localmente e suba a pasta vendor/.', 'warn');
    out('Me envie a saída completa para diagnóstico.', 'info');
}
echo '</div></body></html>';
