<?php
/**
 * INSTALADOR mPDF v2 — com output em tempo real
 * Upload para: sistema/instalar_mpdf2.php
 * Acesse: https://sistema.brenopaiva.com.br/instalar_mpdf2.php
 * APAGUE após instalar!
 */
set_time_limit(600);
ini_set('memory_limit', '512M');
ignore_user_abort(true);

// Flush em tempo real
@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'];
    $cor = $cores[$tipo] ?? '#ccc';
    echo '<div style="color:'.$cor.';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 v2</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;overflow-x:auto;white-space:pre-wrap;font-size:12px;max-height:400px;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 v2</h1>
<div class="box">';

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

// ── DIAGNÓSTICO ──────────────────────────────────────────────
out('<strong>📋 DIAGNÓSTICO DO AMBIENTE</strong>', 'h');
out('PHP: ' . PHP_VERSION . ' (' . (PHP_VERSION_ID >= 80100 ? '✓ OK' : '⚠ Antigo') . ')', PHP_VERSION_ID >= 80100 ? 'ok' : 'warn');
out('Diretório: ' . $base, 'info');
out('Gravável: ' . (is_writable($base) ? '✓ Sim' : '✗ Não'), is_writable($base) ? 'ok' : 'err');
out('allow_url_fopen: ' . (ini_get('allow_url_fopen') ? '✓' : '✗'), ini_get('allow_url_fopen') ? 'ok' : 'warn');
out('curl_exec: ' . (function_exists('curl_exec') ? '✓' : '✗'), function_exists('curl_exec') ? 'ok' : 'warn');
out('shell_exec: ' . (function_exists('shell_exec') && !in_array('shell_exec', array_map('trim', explode(',', ini_get('disable_functions')))) ? '✓' : '✗'), 'warn');
out('proc_open: ' . (function_exists('proc_open') && !in_array('proc_open', array_map('trim', explode(',', ini_get('disable_functions')))) ? '✓' : '✗'), 'warn');
out('memory_limit: ' . ini_get('memory_limit'), 'info');
out('max_execution_time: ' . ini_get('max_execution_time'), 'info');

// Verifica se vendor já existe
if (file_exists($vendor . '/autoload.php') && is_dir($vendor . '/mpdf/mpdf')) {
    out('', 'info');
    out('✅ <strong>mPDF já está instalado!</strong> vendor/mpdf/mpdf encontrado.', 'ok');
    out('Você pode instalar o dompdf_helper.php e apagar este arquivo.', 'ok');
    echo '</div></body></html>';
    exit;
}

// ── PASSO 1: composer.json ───────────────────────────────────
out('', 'info');
out('<strong>📄 PASSO 1: 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 ao composer.json existente', 'ok');
    } else {
        out('⚠ Já tem mpdf/mpdf: ' . $j['require']['mpdf/mpdf'], 'warn');
    }
}

// ── PASSO 2: composer.phar ───────────────────────────────────
out('', 'info');
out('<strong>📦 PASSO 2: Composer</strong>', 'h');
if (!file_exists($phar)) {
    out('Baixando composer.phar...', 'info');
    $ok = false;
    if (function_exists('curl_exec')) {
        $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);
        if ($data && curl_getinfo($ch, CURLINFO_HTTP_CODE) === 200) {
            file_put_contents($phar, $data);
            chmod($phar, 0755);
            out('✓ Baixado (' . round(filesize($phar)/1024) . 'KB)', 'ok');
            $ok = true;
        } else { out('✗ curl falhou: ' . curl_error($ch), 'err'); }
        curl_close($ch);
    }
    if (!$ok) { out('✗ Não conseguiu baixar o Composer', 'err'); echo '</div></body></html>'; exit; }
} else {
    out('✓ composer.phar já existe (' . round(filesize($phar)/1024) . 'KB)', 'ok');
}

// ── PASSO 3: Detectar método de execução ────────────────────
out('', 'info');
out('<strong>⚙️ PASSO 3: Instalando mPDF</strong>', 'h');

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

$disabled = array_map('trim', explode(',', ini_get('disable_functions')));
$has_shell = function_exists('shell_exec') && !in_array('shell_exec', $disabled);
$has_proc  = function_exists('proc_open')  && !in_array('proc_open',  $disabled);
$has_exec  = function_exists('exec')       && !in_array('exec',       $disabled);

out('Método: ' . ($has_proc ? 'proc_open (melhor)' : ($has_shell ? 'shell_exec' : ($has_exec ? 'exec' : 'NENHUM'))), 'info');
out('Comando: <small>' . htmlspecialchars($cmd) . '</small>', 'info');
out('', 'info');
out('⏳ Instalando dependências... (pode demorar 2-5 min)', 'warn');
echo '</div><div class="box"><pre id="log">';
flush(); ob_flush();

if ($has_proc) {
    $desc = [0=>['pipe','r'], 1=>['pipe','w'], 2=>['pipe','w']];
    $proc = proc_open($cmd, $desc, $pipes, $base, ['COMPOSER_HOME' => $base . '/.composer_home']);
    if ($proc) {
        fclose($pipes[0]);
        // Lê em tempo real
        stream_set_blocking($pipes[1], false);
        stream_set_blocking($pipes[2], false);
        $timeout = time() + 300;
        while (time() < $timeout) {
            $out = fgets($pipes[1]);
            $err = fgets($pipes[2]);
            if ($out !== false) { echo htmlspecialchars($out); flush(); ob_flush(); }
            if ($err !== false) { echo htmlspecialchars($err); flush(); ob_flush(); }
            if (feof($pipes[1]) && feof($pipes[2])) break;
            usleep(100000);
        }
        fclose($pipes[1]); fclose($pipes[2]);
        $exit = proc_close($proc);
        echo '</pre>';
        $ok = ($exit === 0);
    } else { echo 'proc_open falhou</pre>'; $ok = false; }
} elseif ($has_shell) {
    $out = shell_exec($cmd);
    echo htmlspecialchars($out ?? 'sem saída');
    echo '</pre>';
    $ok = file_exists($vendor . '/autoload.php');
} elseif ($has_exec) {
    $lines = []; exec($cmd, $lines, $code);
    echo htmlspecialchars(implode("\n", $lines));
    echo '</pre>';
    $ok = ($code === 0);
} else {
    echo 'Todas as funções de execução estão desabilitadas neste servidor.</pre>';
    echo '<div class="box" style="border-color:#e74c3c">';
    out('❌ IMPOSSÍVEL INSTALAR VIA SCRIPT neste servidor.', 'err');
    out('', 'info');
    out('SOLUÇÃO ALTERNATIVA:', 'warn');
    out('1. Baixe o ZIP do mPDF: github.com/mpdf/mpdf/releases', 'info');
    out('2. Na sua máquina, rode: composer require mpdf/mpdf', 'info');
    out('3. Suba a pasta vendor/ inteira para: sistema/vendor/', 'info');
    out('4. Instale o dompdf_helper.php do pacote', 'info');
    echo '</div></body></html>';
    exit;
}

// ── RESULTADO ────────────────────────────────────────────────
echo '<div class="box">';
if ($ok || (file_exists($vendor . '/autoload.php') && is_dir($vendor . '/mpdf/mpdf'))) {
    out('', 'info');
    out('✅ <strong>mPDF instalado com sucesso!</strong>', 'ok');
    out('vendor/autoload.php: ' . (file_exists($vendor.'/autoload.php') ? '✓' : '✗'), 'ok');
    out('vendor/mpdf/mpdf: '    . (is_dir($vendor.'/mpdf/mpdf')         ? '✓' : '✗'), 'ok');
    out('', 'info');
    out('🎯 PRÓXIMOS PASSOS:', 'h');
    out('1. Suba o dompdf_helper.php → application/helpers/dompdf_helper.php', 'info');
    out('2. <strong>APAGUE este arquivo (instalar_mpdf2.php) agora!</strong>', 'warn');
    out('3. Teste gerando um PDF no sistema', 'info');
} else {
    out('❌ Instalação falhou. Veja a saída acima para detalhes.', 'err');
    out('Se a saída está vazia, o servidor pode ter cortado a execução por timeout.', 'warn');
    out('Tente a solução alternativa: instalar localmente e subir a pasta vendor/.', 'warn');
}
echo '</div></body></html>';
