<?php
/**
 * Debug de Sesiones - Diagnóstico de problemas de logout automático
 */
error_reporting(E_ALL);
ini_set('display_errors', '1');

session_start();

require_once __DIR__ . '/config/bootstrap.php';

use App\Services\Database;
use App\Services\AuthService;

?>
<!DOCTYPE html>
<html>
<head>
    <title>Debug - Sesión</title>
    <style>
        body { font-family: monospace; padding: 20px; background: #1e1e1e; color: #d4d4d4; }
        h2 { color: #4ec9b0; border-bottom: 2px solid #4ec9b0; padding-bottom: 10px; }
        .section { background: #252526; padding: 20px; margin: 20px 0; border-radius: 8px; border-left: 4px solid #007acc; }
        .success { color: #4ec9b0; }
        .error { color: #f48771; }
        .warning { color: #dcdcaa; }
        table { width: 100%; border-collapse: collapse; margin: 10px 0; }
        th, td { padding: 10px; text-align: left; border-bottom: 1px solid #3e3e42; }
        th { color: #4ec9b0; background: #2d2d30; }
        .code { background: #1e1e1e; padding: 10px; border-radius: 4px; margin: 10px 0; }
    </style>
</head>
<body>
    <h1>🔍 Debug de Sesión - Diagnóstico</h1>

    <div class="section">
        <h2>1. Variables de Sesión PHP ($_SESSION)</h2>
        <?php if (empty($_SESSION)): ?>
            <p class="error">❌ No hay variables de sesión activas</p>
        <?php else: ?>
            <p class="success">✓ Sesión activa</p>
            <table>
                <tr><th>Clave</th><th>Valor</th></tr>
                <?php foreach ($_SESSION as $key => $value): ?>
                    <tr>
                        <td><?= htmlspecialchars($key) ?></td>
                        <td><?= htmlspecialchars(is_array($value) ? json_encode($value) : $value) ?></td>
                    </tr>
                <?php endforeach; ?>
            </table>
        <?php endif; ?>
    </div>

    <div class="section">
        <h2>2. Sesión en Base de Datos</h2>
        <?php
        $db = Database::getInstance();

        if (isset($_SESSION['session_id'])) {
            echo "<p class='success'>✓ session_id en PHP: " . htmlspecialchars($_SESSION['session_id']) . "</p>";

            $dbSession = $db->fetchOne(
                "SELECT * FROM sessions WHERE id = :id",
                [':id' => $_SESSION['session_id']]
            );

            if ($dbSession) {
                echo "<p class='success'>✓ Sesión encontrada en BD</p>";
                echo "<table>";
                foreach ($dbSession as $key => $value) {
                    echo "<tr><td>" . htmlspecialchars($key) . "</td><td>" . htmlspecialchars($value) . "</td></tr>";
                }
                echo "</table>";

                // Verificar expiración
                $now = date('Y-m-d H:i:s');
                $mysqlNow = $db->fetchOne("SELECT NOW() as now")['now'];
                $expired = strtotime($dbSession['expires_at']) < strtotime($mysqlNow);

                echo "<div class='code'>";
                echo "<strong>Verificación de Expiración:</strong><br>";
                echo "PHP time(): " . htmlspecialchars($now) . "<br>";
                echo "MySQL NOW(): " . htmlspecialchars($mysqlNow) . "<br>";
                echo "expires_at (BD): " . htmlspecialchars($dbSession['expires_at']) . "<br>";
                echo "¿Expirado?: " . ($expired ? "<span class='error'>SÍ ❌</span>" : "<span class='success'>NO ✓</span>") . "<br>";
                echo "</div>";

            } else {
                echo "<p class='error'>❌ Sesión NO encontrada en BD</p>";
                echo "<p class='warning'>⚠️ Esto significa que el session_id en PHP no coincide con ningún registro en la tabla sessions</p>";
            }
        } else {
            echo "<p class='error'>❌ No hay session_id en $_SESSION</p>";
        }
        ?>
    </div>

    <div class="section">
        <h2>3. Usuario en Base de Datos</h2>
        <?php
        if (isset($_SESSION['admin_id'])) {
            echo "<p class='success'>✓ admin_id en PHP: " . htmlspecialchars($_SESSION['admin_id']) . "</p>";

            $admin = $db->fetchOne(
                "SELECT id, email, nombre, rol, activo FROM admins WHERE id = :id",
                [':id' => $_SESSION['admin_id']]
            );

            if ($admin) {
                echo "<p class='success'>✓ Usuario encontrado en BD</p>";
                echo "<table>";
                foreach ($admin as $key => $value) {
                    echo "<tr><td>" . htmlspecialchars($key) . "</td><td>" . htmlspecialchars($value) . "</td></tr>";
                }
                echo "</table>";

                if ($admin['activo'] != 1) {
                    echo "<p class='error'>❌ PROBLEMA: Usuario está INACTIVO (activo = {$admin['activo']})</p>";
                }
            } else {
                echo "<p class='error'>❌ Usuario NO encontrado en BD</p>";
            }
        } else {
            echo "<p class='error'>❌ No hay admin_id en $_SESSION</p>";
        }
        ?>
    </div>

    <div class="section">
        <h2>4. Test de AuthService</h2>
        <?php
        try {
            $auth = new AuthService();

            // Test check()
            $checkResult = $auth->check();
            echo "<p>auth->check(): " . ($checkResult ? "<span class='success'>true ✓</span>" : "<span class='error'>false ❌</span>") . "</p>";

            // Test user()
            $user = $auth->user();
            if ($user) {
                echo "<p class='success'>✓ auth->user() retorna usuario:</p>";
                echo "<div class='code'>" . htmlspecialchars(json_encode($user, JSON_PRETTY_PRINT)) . "</div>";
            } else {
                echo "<p class='error'>❌ auth->user() retorna NULL</p>";
                echo "<p class='warning'>⚠️ Esto causa que requireAuth() redireccione al login</p>";
            }

        } catch (Exception $e) {
            echo "<p class='error'>❌ Error en AuthService: " . htmlspecialchars($e->getMessage()) . "</p>";
        }
        ?>
    </div>

    <div class="section">
        <h2>5. Todas las Sesiones en BD</h2>
        <?php
        $allSessions = $db->query("
            SELECT s.*, a.nombre, a.email
            FROM sessions s
            LEFT JOIN admins a ON s.admin_id = a.id
            ORDER BY s.created_at DESC
            LIMIT 10
        ");

        if (empty($allSessions)) {
            echo "<p class='warning'>⚠️ No hay sesiones en la base de datos</p>";
        } else {
            echo "<table>";
            echo "<tr><th>ID</th><th>Admin</th><th>Email</th><th>IP</th><th>Expira</th><th>Creado</th></tr>";
            foreach ($allSessions as $s) {
                $isExpired = strtotime($s['expires_at']) < time();
                $class = $isExpired ? 'error' : 'success';
                echo "<tr class='{$class}'>";
                echo "<td>" . htmlspecialchars(substr($s['id'], 0, 8)) . "...</td>";
                echo "<td>" . htmlspecialchars($s['nombre'] ?? 'N/A') . "</td>";
                echo "<td>" . htmlspecialchars($s['email'] ?? 'N/A') . "</td>";
                echo "<td>" . htmlspecialchars($s['ip_address']) . "</td>";
                echo "<td>" . htmlspecialchars($s['expires_at']) . ($isExpired ? ' ⚠️' : '') . "</td>";
                echo "<td>" . htmlspecialchars($s['created_at']) . "</td>";
                echo "</tr>";
            }
            echo "</table>";
        }
        ?>
    </div>

    <div class="section">
        <h2>6. Timezone y Hora</h2>
        <?php
        $phpTime = date('Y-m-d H:i:s');
        $phpGmdate = gmdate('Y-m-d H:i:s');
        $mysqlNow = $db->fetchOne("SELECT NOW() as now")['now'];
        $mysqlUtc = $db->fetchOne("SELECT UTC_TIMESTAMP() as utc")['utc'];

        echo "<table>";
        echo "<tr><th>Fuente</th><th>Tiempo</th></tr>";
        echo "<tr><td>PHP date()</td><td>{$phpTime}</td></tr>";
        echo "<tr><td>PHP gmdate()</td><td>{$phpGmdate}</td></tr>";
        echo "<tr><td>MySQL NOW()</td><td>{$mysqlNow}</td></tr>";
        echo "<tr><td>MySQL UTC_TIMESTAMP()</td><td>{$mysqlUtc}</td></tr>";
        echo "</table>";

        $diff = strtotime($phpTime) - strtotime($mysqlNow);
        if (abs($diff) > 60) {
            echo "<p class='error'>❌ PROBLEMA: Diferencia de tiempo entre PHP y MySQL: {$diff} segundos</p>";
        } else {
            echo "<p class='success'>✓ Tiempos sincronizados (diferencia: {$diff}s)</p>";
        }
        ?>
    </div>

    <div class="section">
        <h2>7. Diagnóstico y Recomendaciones</h2>
        <?php
        $problems = [];

        if (empty($_SESSION)) {
            $problems[] = "No hay sesión PHP activa - hacer login primero";
        }

        if (isset($_SESSION['session_id']) && !isset($dbSession)) {
            $problems[] = "session_id en PHP no existe en BD - sesión huérfana";
        }

        if (isset($dbSession) && isset($expired) && $expired) {
            $problems[] = "Sesión expirada en BD";
        }

        if (isset($admin) && $admin['activo'] != 1) {
            $problems[] = "Usuario inactivo en BD";
        }

        if (!$checkResult && isset($_SESSION['admin_id'])) {
            $problems[] = "auth->check() retorna false - revisar lógica de verificación";
        }

        if (abs($diff) > 60) {
            $problems[] = "Diferencia de timezone entre PHP y MySQL - usar gmdate() y UTC_TIMESTAMP()";
        }

        if (empty($problems)) {
            echo "<p class='success'>✅ No se detectaron problemas obvios</p>";
            echo "<p>Si aún tienes problemas, verifica:</p>";
            echo "<ul>";
            echo "<li>Que APP_ENV esté configurado correctamente en .env</li>";
            echo "<li>Que los headers se envíen antes de session_start()</li>";
            echo "<li>Que no haya múltiples session_start()</li>";
            echo "</ul>";
        } else {
            echo "<p class='error'>❌ Problemas detectados:</p>";
            echo "<ul>";
            foreach ($problems as $problem) {
                echo "<li class='error'>{$problem}</li>";
            }
            echo "</ul>";
        }
        ?>
    </div>

    <div class="section">
        <h2>8. Acciones</h2>
        <p>
            <a href="public/admin/login.php" style="color: #4ec9b0;">→ Ir a Login</a> |
            <a href="public/admin/dashboard.php" style="color: #4ec9b0;">→ Ir a Dashboard</a> |
            <a href="?clear=1" style="color: #f48771;">→ Limpiar Sesión</a>
        </p>

        <?php
        if (isset($_GET['clear'])) {
            session_destroy();
            echo "<p class='warning'>⚠️ Sesión destruida - <a href='debug-session.php'>Recargar</a></p>";
        }
        ?>
    </div>

</body>
</html>
