<?php
/**
 * Script de Verificación Post-Instalación
 * Sistema de Inventario Forestal de Guatemala
 * 
 * Ejecutar después de la instalación para verificar que todo funcione correctamente
 * URL: https://tudominio.com/verify-installation.php
 */

// Solo permitir en desarrollo o con parámetro especial
if (!isset($_GET['verify']) || $_GET['verify'] !== 'sif-gt-2025') {
    http_response_code(404);
    exit('Not Found');
}

?>
<!DOCTYPE html>
<html lang="es">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Verificación de Instalación - SIF Guatemala</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; background: #f5f5f5; }
        .container { max-width: 800px; margin: 0 auto; background: white; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        .header { text-align: center; color: #2c5530; margin-bottom: 30px; }
        .check { margin: 10px 0; padding: 10px; border-radius: 4px; }
        .success { background: #d4edda; color: #155724; border: 1px solid #c3e6cb; }
        .warning { background: #fff3cd; color: #856404; border: 1px solid #ffeaa7; }
        .error { background: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; }
        .info { background: #d1ecf1; color: #0c5460; border: 1px solid #bee5eb; }
        .section { margin: 20px 0; }
        .section h3 { color: #2c5530; border-bottom: 2px solid #2c5530; padding-bottom: 5px; }
        pre { background: #f8f9fa; padding: 10px; border-radius: 4px; overflow-x: auto; }
        .stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 15px; margin: 20px 0; }
        .stat-card { background: #f8f9fa; padding: 15px; border-radius: 4px; text-align: center; }
        .stat-number { font-size: 24px; font-weight: bold; color: #2c5530; }
        .btn { display: inline-block; padding: 10px 20px; background: #2c5530; color: white; text-decoration: none; border-radius: 4px; margin: 5px; }
        .btn:hover { background: #1e3a21; }
    </style>
</head>
<body>
    <div class="container">
        <div class="header">
            <h1>🌲 Verificación de Instalación</h1>
            <h2>Sistema de Inventario Forestal de Guatemala</h2>
            <p>Verificando configuración y funcionamiento del sistema...</p>
        </div>

        <?php
        $checks = [];
        $errors = 0;
        $warnings = 0;
        $success = 0;

        // Función para agregar verificación
        function addCheck($name, $status, $message, $details = '') {
            global $checks, $errors, $warnings, $success;
            
            $checks[] = [
                'name' => $name,
                'status' => $status,
                'message' => $message,
                'details' => $details
            ];
            
            if ($status === 'error') $errors++;
            elseif ($status === 'warning') $warnings++;
            else $success++;
        }

        // 1. Verificar archivos críticos
        $criticalFiles = [
            '.env' => 'Archivo de configuración',
            '.htaccess' => 'Configuración de Apache',
            'api/index.php' => 'API principal',
            'api/config/database.php' => 'Configuración de base de datos',
            'index.html' => 'Aplicación principal'
        ];

        foreach ($criticalFiles as $file => $desc) {
            if (file_exists($file)) {
                addCheck("Archivo: {$desc}", 'success', "✅ {$file} existe");
            } else {
                addCheck("Archivo: {$desc}", 'error', "❌ {$file} no encontrado");
            }
        }

        // 2. Verificar directorios y permisos
        $directories = [
            'uploads' => 0755,
            'logs' => 0755,
            'cache' => 0755,
            'backups' => 0755
        ];

        foreach ($directories as $dir => $expectedPerm) {
            if (is_dir($dir)) {
                $currentPerm = fileperms($dir) & 0777;
                if ($currentPerm >= $expectedPerm) {
                    addCheck("Directorio: {$dir}", 'success', "✅ Permisos correctos (" . decoct($currentPerm) . ")");
                } else {
                    addCheck("Directorio: {$dir}", 'warning', "⚠️ Permisos insuficientes (" . decoct($currentPerm) . ", necesario: " . decoct($expectedPerm) . ")");
                }
                
                if (!is_writable($dir)) {
                    addCheck("Escritura: {$dir}", 'error', "❌ No se puede escribir en {$dir}");
                } else {
                    addCheck("Escritura: {$dir}", 'success', "✅ {$dir} escribible");
                }
            } else {
                addCheck("Directorio: {$dir}", 'error', "❌ {$dir} no existe");
            }
        }

        // 3. Verificar extensiones PHP
        $requiredExtensions = [
            'mysqli' => 'Conexión MySQL',
            'pdo_mysql' => 'PDO MySQL',
            'json' => 'Manejo JSON',
            'mbstring' => 'Strings multibyte',
            'curl' => 'Peticiones HTTP',
            'gd' => 'Procesamiento imágenes',
            'zip' => 'Compresión archivos',
            'fileinfo' => 'Información archivos'
        ];

        foreach ($requiredExtensions as $ext => $desc) {
            if (extension_loaded($ext)) {
                addCheck("Extensión: {$desc}", 'success', "✅ {$ext} disponible");
            } else {
                addCheck("Extensión: {$desc}", 'error', "❌ {$ext} no disponible");
            }
        }

        // 4. Verificar configuración PHP
        $phpConfig = [
            'memory_limit' => ['min' => '256M', 'current' => ini_get('memory_limit')],
            'max_execution_time' => ['min' => 300, 'current' => ini_get('max_execution_time')],
            'upload_max_filesize' => ['min' => '10M', 'current' => ini_get('upload_max_filesize')],
            'post_max_size' => ['min' => '50M', 'current' => ini_get('post_max_size')]
        ];

        foreach ($phpConfig as $setting => $config) {
            $current = $config['current'];
            $min = $config['min'];
            
            if ($setting === 'memory_limit' || $setting === 'upload_max_filesize' || $setting === 'post_max_size') {
                $currentBytes = $this->parseSize($current);
                $minBytes = $this->parseSize($min);
                $status = $currentBytes >= $minBytes ? 'success' : 'warning';
                $icon = $status === 'success' ? '✅' : '⚠️';
            } else {
                $status = (int)$current >= (int)$min ? 'success' : 'warning';
                $icon = $status === 'success' ? '✅' : '⚠️';
            }
            
            addCheck("PHP: {$setting}", $status, "{$icon} {$current} (mínimo: {$min})");
        }

        // 5. Verificar base de datos
        if (file_exists('.env')) {
            $env = file_get_contents('.env');
            preg_match('/DB_HOST=(.*)/', $env, $host);
            preg_match('/DB_NAME=(.*)/', $env, $name);
            preg_match('/DB_USER=(.*)/', $env, $user);
            preg_match('/DB_PASS=(.*)/', $env, $pass);
            
            if ($host && $name && $user) {
                try {
                    $pdo = new PDO(
                        "mysql:host=" . trim($host[1]) . ";dbname=" . trim($name[1]),
                        trim($user[1]),
                        trim($pass[1] ?? ''),
                        [PDO::ATTR_TIMEOUT => 5]
                    );
                    
                    addCheck("Base de Datos: Conexión", 'success', "✅ Conexión exitosa");
                    
                    // Verificar tablas
                    $stmt = $pdo->query("SHOW TABLES");
                    $tables = $stmt->fetchAll(PDO::FETCH_COLUMN);
                    
                    $expectedTables = ['usuarios', 'proyectos', 'rodales', 'datos_campo', 'especies'];
                    $missingTables = array_diff($expectedTables, $tables);
                    
                    if (empty($missingTables)) {
                        addCheck("Base de Datos: Tablas", 'success', "✅ Todas las tablas existen (" . count($tables) . " tablas)");
                    } else {
                        addCheck("Base de Datos: Tablas", 'error', "❌ Tablas faltantes: " . implode(', ', $missingTables));
                    }
                    
                    // Verificar datos iniciales
                    $stmt = $pdo->query("SELECT COUNT(*) FROM especies");
                    $speciesCount = $stmt->fetchColumn();
                    
                    if ($speciesCount > 0) {
                        addCheck("Datos: Especies", 'success', "✅ {$speciesCount} especies cargadas");
                    } else {
                        addCheck("Datos: Especies", 'warning', "⚠️ No hay especies cargadas");
                    }
                    
                } catch (Exception $e) {
                    addCheck("Base de Datos: Conexión", 'error', "❌ Error: " . $e->getMessage());
                }
            } else {
                addCheck("Base de Datos: Configuración", 'error', "❌ Configuración incompleta en .env");
            }
        }

        // 6. Verificar URLs críticas
        $baseUrl = isset($_SERVER['HTTPS']) ? 'https://' : 'http://';
        $baseUrl .= $_SERVER['HTTP_HOST'];
        
        $urls = [
            '/' => 'Aplicación principal',
            '/api/auth/health' => 'API Health Check',
            '/api/species' => 'API Especies'
        ];

        foreach ($urls as $path => $desc) {
            $url = $baseUrl . $path;
            $context = stream_context_create([
                'http' => [
                    'timeout' => 10,
                    'method' => 'GET'
                ]
            ]);
            
            $response = @file_get_contents($url, false, $context);
            
            if ($response !== false) {
                addCheck("URL: {$desc}", 'success', "✅ {$path} responde");
            } else {
                addCheck("URL: {$desc}", 'warning', "⚠️ {$path} no responde");
            }
        }

        // 7. Verificar seguridad
        $protectedFiles = [
            '/.env',
            '/api/config/config.php',
            '/logs/system.log',
            '/backups/'
        ];

        foreach ($protectedFiles as $path) {
            $url = $baseUrl . $path;
            $headers = @get_headers($url);
            
            if ($headers && (strpos($headers[0], '403') !== false || strpos($headers[0], '404') !== false)) {
                addCheck("Seguridad: " . basename($path), 'success', "✅ {$path} protegido");
            } else {
                addCheck("Seguridad: " . basename($path), 'error', "❌ {$path} accesible públicamente");
            }
        }

        // Función para parsear tamaños
        function parseSize($size) {
            $size = trim($size);
            $last = strtolower($size[strlen($size)-1]);
            $size = (int) $size;
            
            switch($last) {
                case 'g':
                    $size *= 1024;
                case 'm':
                    $size *= 1024;
                case 'k':
                    $size *= 1024;
            }
            
            return $size;
        }
        ?>

        <!-- Resumen -->
        <div class="section">
            <h3>📊 Resumen de Verificación</h3>
            <div class="stats">
                <div class="stat-card">
                    <div class="stat-number" style="color: #28a745;"><?php echo $success; ?></div>
                    <div>Verificaciones Exitosas</div>
                </div>
                <div class="stat-card">
                    <div class="stat-number" style="color: #ffc107;"><?php echo $warnings; ?></div>
                    <div>Advertencias</div>
                </div>
                <div class="stat-card">
                    <div class="stat-number" style="color: #dc3545;"><?php echo $errors; ?></div>
                    <div>Errores</div>
                </div>
                <div class="stat-card">
                    <div class="stat-number"><?php echo count($checks); ?></div>
                    <div>Total Verificaciones</div>
                </div>
            </div>
        </div>

        <!-- Estado General -->
        <div class="section">
            <?php if ($errors === 0): ?>
                <div class="check success">
                    <strong>🎉 ¡Instalación Exitosa!</strong><br>
                    El sistema está correctamente configurado y listo para usar.
                    <?php if ($warnings > 0): ?>
                    <br><em>Nota: Hay <?php echo $warnings; ?> advertencia(s) que deberías revisar.</em>
                    <?php endif; ?>
                </div>
            <?php elseif ($errors <= 2): ?>
                <div class="check warning">
                    <strong>⚠️ Instalación con Problemas Menores</strong><br>
                    El sistema puede funcionar pero hay <?php echo $errors; ?> error(es) que deberías corregir.
                </div>
            <?php else: ?>
                <div class="check error">
                    <strong>❌ Instalación con Problemas Críticos</strong><br>
                    Hay <?php echo $errors; ?> errores críticos que deben corregirse antes de usar el sistema.
                </div>
            <?php endif; ?>
        </div>

        <!-- Detalles de Verificaciones -->
        <div class="section">
            <h3>🔍 Detalles de Verificaciones</h3>
            <?php foreach ($checks as $check): ?>
                <div class="check <?php echo $check['status']; ?>">
                    <strong><?php echo $check['name']; ?></strong><br>
                    <?php echo $check['message']; ?>
                    <?php if ($check['details']): ?>
                        <pre><?php echo $check['details']; ?></pre>
                    <?php endif; ?>
                </div>
            <?php endforeach; ?>
        </div>

        <!-- Información del Sistema -->
        <div class="section">
            <h3>💻 Información del Sistema</h3>
            <div class="check info">
                <strong>Servidor:</strong> <?php echo $_SERVER['SERVER_SOFTWARE'] ?? 'Desconocido'; ?><br>
                <strong>PHP:</strong> <?php echo PHP_VERSION; ?><br>
                <strong>Fecha:</strong> <?php echo date('Y-m-d H:i:s'); ?><br>
                <strong>Timezone:</strong> <?php echo date_default_timezone_get(); ?><br>
                <strong>Memoria PHP:</strong> <?php echo ini_get('memory_limit'); ?><br>
                <strong>Directorio:</strong> <?php echo __DIR__; ?>
            </div>
        </div>

        <!-- Acciones Recomendadas -->
        <div class="section">
            <h3>🔧 Acciones Recomendadas</h3>
            
            <?php if ($errors > 0): ?>
            <div class="check error">
                <strong>Corregir Errores Críticos:</strong><br>
                • Revisar configuración de base de datos<br>
                • Verificar permisos de archivos y directorios<br>
                • Instalar extensiones PHP faltantes<br>
                • Configurar archivos de protección (.htaccess)
            </div>
            <?php endif; ?>

            <?php if ($warnings > 0): ?>
            <div class="check warning">
                <strong>Revisar Advertencias:</strong><br>
                • Optimizar configuración PHP<br>
                • Verificar URLs que no responden<br>
                • Cargar datos iniciales faltantes
            </div>
            <?php endif; ?>

            <div class="check info">
                <strong>Pasos Siguientes:</strong><br>
                • Eliminar este archivo de verificación<br>
                • Configurar cron jobs para mantenimiento<br>
                • Configurar SSL/HTTPS<br>
                • Realizar backup inicial<br>
                • Capacitar usuarios del sistema
            </div>
        </div>

        <!-- Enlaces Útiles -->
        <div class="section">
            <h3>🔗 Enlaces Útiles</h3>
            <a href="/" class="btn">🏠 Ir a la Aplicación</a>
            <a href="/api/auth/health" class="btn">🔍 API Health Check</a>
            <a href="/scripts/system-monitor.php?action=monitor" class="btn">📊 Monitoreo del Sistema</a>
            <a href="/scripts/backup-database.php?action=backup" class="btn">💾 Backup Manual</a>
        </div>

        <!-- Advertencia de Seguridad -->
        <div class="section">
            <div class="check warning">
                <strong>⚠️ IMPORTANTE - SEGURIDAD:</strong><br>
                Elimina este archivo (<code>verify-installation.php</code>) después de completar la verificación.<br>
                Este archivo contiene información sensible del sistema y no debe estar disponible en producción.
            </div>
        </div>
    </div>
</body>
</html>