<?php
/**
 * DIAGNOSTICO DE DOBLE LOGIN - DOKUWIKI
 * ======================================
 * Investiga por que DokuWiki pide loguearse dos veces.
 *
 * Causas comunes del doble login:
 *   1. COOKIE PATH: La cookie de sesion se setea con un path que no coincide
 *      con la URL actual, entonces el navegador no la envia en el siguiente request.
 *   2. BASEURL/BASEDIR: Si conf[baseurl] o conf[basedir] no coinciden con la URL
 *      real, DOKU_REL se calcula diferente y la cookie tiene nombre distinto.
 *   3. DOMINIO CRUZADO: Si el href en la pagina web apunta a un dominio diferente
 *      (ej: systemsie.site vs sistemavirtualdegestion.com), la sesion no se comparte.
 *   4. SECURECOOKIE + HTTPS: Si securecookie esta activo, la cookie incluye el puerto
 *      en su nombre. Mezclar HTTP/HTTPS produce cookies diferentes.
 *   5. SESSION CONFLICT: Multiples DokuWiki en el mismo dominio comparten el nombre
 *      de sesion "DokuWiki" - la sesion de uno puede invalidar la del otro.
 *   6. HTACCESS/REWRITE: Reglas de rewrite que cambian la ruta efectiva.
 *
 * MODOS DE USO:
 *   1. Colocar en la raiz de un subdominio y acceder desde el navegador
 *   2. php diagnostico_login.php /ruta/al/subdominio
 *   3. Desde el navegador con ?sub=nombre_subdominio
 *
 * CONFIGURACION: Ajustar $basePath
 */

// =====================================================================
//  CONFIGURACION
// =====================================================================

$basePath = '/home/systeng3/public_html';

// Dominios conocidos del sistema
$dominiosConocidos = [
    'sistemavirtualdegestion.com',
    'systemsie.site',
    'susprofesionales.com',
    'sieasesorias.com',
    'gestioncontrolada.com',
];

// =====================================================================
//  DETECCION DE RUTA
// =====================================================================

$esCLI = (php_sapi_name() === 'cli');
$targetPath = '';

if ($esCLI) {
    $targetPath = isset($argv[1]) ? rtrim($argv[1], '/') : '';
    if (empty($targetPath)) {
        echo "Uso: php diagnostico_login.php /ruta/al/subdominio\n";
        echo "     php diagnostico_login.php --scan  (escanear todos)\n";
        exit(0);
    }
} else {
    header('Content-Type: text/html; charset=UTF-8');
    $docRoot = rtrim($_SERVER['DOCUMENT_ROOT'] ?? '', '/');
    if (isset($_GET['sub']) && !empty($_GET['sub'])) {
        $subParam = trim($_GET['sub']);
        // Si viene una URL completa, extraer el subdominio del host
        if (preg_match('#^https?://#i', $subParam)) {
            $parsed = parse_url($subParam);
            if (isset($parsed['host'])) {
                $parts = explode('.', $parsed['host']);
                $subParam = $parts[0];
            }
        }
        $subParam = basename(preg_replace('/[^a-zA-Z0-9._-]/', '', $subParam));
        if (!empty($subParam)) {
            $targetPath = $basePath . '/' . $subParam;
        }
    } elseif (isset($_GET['path'])) {
        $targetPath = rtrim($_GET['path'], '/');
    } elseif ($docRoot && file_exists($docRoot . '/doku.php')) {
        $targetPath = $docRoot;
    }
}

$modoScanAll = ($esCLI && isset($argv[1]) && $argv[1] === '--scan');

// =====================================================================
//  FUNCIONES DE DIAGNOSTICO
// =====================================================================

/**
 * Lee la configuracion de DokuWiki de un subdominio.
 */
function leerConfigDoku($subPath)
{
    $config = [
        'baseurl'       => '',
        'basedir'       => '',
        'cookiedir'     => '',
        'securecookie'  => 1, // default DokuWiki es 1
        'useacl'        => 0,
        'authtype'      => 'authplain',
        'rememberme'    => 1,
        'template'      => '',
        'title'         => '',
        'start'         => 'start',
    ];

    // Cargar defaults
    $confFile = $subPath . '/conf/dokuwiki.php';
    if (file_exists($confFile)) {
        $conf = [];
        @include($confFile);
        $config = array_merge($config, array_intersect_key($conf, $config));
    }

    // Cargar local overrides
    foreach (['conf/local.php', 'conf/local_act.php'] as $localFile) {
        $path = $subPath . '/' . $localFile;
        if (file_exists($path)) {
            $conf = [];
            // Extraer con regex para evitar efectos secundarios de include
            $content = file_get_contents($path);
            if (preg_match_all("/\\\$conf\['([^']+)'\]\s*=\s*'([^']*)'\s*;/", $content, $m)) {
                for ($i = 0; $i < count($m[1]); $i++) {
                    if (array_key_exists($m[1][$i], $config)) {
                        $config[$m[1][$i]] = $m[1][$i] === 'useacl' || $m[1][$i] === 'securecookie' || $m[1][$i] === 'rememberme'
                            ? (int) $m[2][$i]
                            : $m[2][$i];
                    }
                }
            }
            // Tambien capturar valores numericos sin comillas
            if (preg_match_all("/\\\$conf\['([^']+)'\]\s*=\s*(\d+)\s*;/", $content, $m)) {
                for ($i = 0; $i < count($m[1]); $i++) {
                    if (array_key_exists($m[1][$i], $config)) {
                        $config[$m[1][$i]] = (int) $m[2][$i];
                    }
                }
            }
        }
    }

    return $config;
}

/**
 * Simula el calculo de DOKU_REL y DOKU_COOKIE como lo hace DokuWiki.
 */
function simularCookieCalc($config, $carpeta)
{
    $result = [
        'DOKU_REL' => '',
        'DOKU_COOKIE' => '',
        'SESSION_PATH' => '',
        'SESSION_NAME' => 'DokuWiki',
    ];

    // DOKU_REL se calcula de basedir o de la URL
    if (!empty($config['basedir'])) {
        $dir = $config['basedir'];
        if ($dir[0] !== '/') $dir = '/' . $dir;
        $dir = rtrim($dir, '/') . '/';
        $result['DOKU_REL'] = $dir;
    } else {
        // Sin basedir, DokuWiki calcula desde la URL del script
        // En produccion seria algo como /subdominio/ o / dependiendo de la config del vhost
        $result['DOKU_REL'] = '/'; // Asumimos raiz del subdominio
    }

    // DOKU_COOKIE = 'DW' . md5(DOKU_REL . (securecookie ? port : ''))
    // En HTTPS, el puerto tipico es 443
    $portPart = $config['securecookie'] ? '443' : '';
    $result['DOKU_COOKIE'] = 'DW' . md5($result['DOKU_REL'] . $portPart);

    // SESSION_PATH = cookiedir o DOKU_REL
    $result['SESSION_PATH'] = !empty($config['cookiedir']) ? $config['cookiedir'] : $result['DOKU_REL'];

    return $result;
}

/**
 * Diagnostica problemas de login doble para un subdominio.
 */
function diagnosticarLogin($subPath, $carpeta, $dominiosConocidos)
{
    $diag = [
        'carpeta'       => $carpeta,
        'existe'        => false,
        'tiene_doku'    => false,
        'tiene_web'     => false,
        'config'        => [],
        'cookie_info'   => [],
        'problemas'     => [],
        'info'          => [],
    ];

    if (!is_dir($subPath)) {
        $diag['problemas'][] = ['tipo' => 'FATAL', 'mensaje' => "Carpeta no existe: {$subPath}"];
        return $diag;
    }
    $diag['existe'] = true;

    if (!file_exists($subPath . '/doku.php')) {
        $diag['problemas'][] = ['tipo' => 'FATAL', 'mensaje' => 'No tiene doku.php - no es un sistema DokuWiki'];
        return $diag;
    }
    $diag['tiene_doku'] = true;
    $diag['tiene_web'] = is_dir($subPath . '/web');

    // 1. Leer configuracion
    $config = leerConfigDoku($subPath);
    $diag['config'] = $config;

    // 2. Calcular cookies
    $cookieInfo = simularCookieCalc($config, $carpeta);
    $diag['cookie_info'] = $cookieInfo;

    // ===== VERIFICACIONES =====

    // CHECK 1: baseurl apunta a un dominio diferente al del subdominio
    if (!empty($config['baseurl'])) {
        $parsed = parse_url($config['baseurl']);
        if (isset($parsed['host'])) {
            $host = $parsed['host'];
            $parts = explode('.', $host);
            $subEnConfig = $parts[0] ?? '';
            $domEnConfig = count($parts) >= 3 ? implode('.', array_slice($parts, 1)) : $host;

            // El subdominio en baseurl no coincide con el nombre de la carpeta
            if ($subEnConfig !== $carpeta) {
                $diag['problemas'][] = [
                    'tipo' => 'CRITICO',
                    'causa' => 'BASEURL_SUBDOMINIO',
                    'mensaje' => "baseurl tiene subdominio '{$subEnConfig}' pero la carpeta es '{$carpeta}'. Si el usuario accede por '{$carpeta}.dominio.com' pero la cookie se setea para '{$subEnConfig}.dominio.com', la sesion se pierde.",
                    'solucion' => "Corregir \$conf['baseurl'] en conf/local.php a: https://{$carpeta}.{$domEnConfig}/",
                ];
            }

            // Verificar HTTPS vs HTTP
            $scheme = $parsed['scheme'] ?? 'http';
            if ($scheme !== 'https') {
                $diag['problemas'][] = [
                    'tipo' => 'MEDIO',
                    'causa' => 'BASEURL_HTTP',
                    'mensaje' => "baseurl usa '{$scheme}://' pero el sitio probablemente usa HTTPS. Si securecookie esta activo, el navegador no enviara la cookie en la redireccion HTTPS.",
                    'solucion' => "Cambiar baseurl a https://...",
                ];
            }

            $diag['info'][] = "baseurl configurado: {$config['baseurl']}";
        }
    } else {
        $diag['info'][] = "baseurl no configurado (se calcula automaticamente)";
    }

    // CHECK 2: basedir podria causar DOKU_REL incorrecto
    if (!empty($config['basedir'])) {
        $bd = $config['basedir'];
        if ($bd !== '/') {
            $diag['problemas'][] = [
                'tipo' => 'MEDIO',
                'causa' => 'BASEDIR_NO_RAIZ',
                'mensaje' => "basedir es '{$bd}' (no es '/'). Si el subdominio esta en la raiz del vhost, basedir deberia ser '/'. Un basedir incorrecto genera un DOKU_REL diferente y por tanto una cookie con nombre diferente en cada request.",
                'solucion' => "Verificar que basedir sea '/' si el subdominio esta en la raiz.",
            ];
        }
    }

    // CHECK 3: securecookie + mezcla HTTP/HTTPS
    if ($config['securecookie']) {
        $diag['info'][] = "securecookie = 1 (activo). La cookie DOKU_COOKIE incluye el puerto del servidor. Si hay mezcla HTTP/HTTPS, la cookie cambia de nombre.";
    }

    // CHECK 4: Conflicto de sesiones entre subdominios
    // Todos los subdominios usan session_name = "DokuWiki"
    // Si estan en el mismo dominio principal con cookies de sesion en path '/',
    // podrian compartir/pisar sesiones.
    if ($cookieInfo['SESSION_PATH'] === '/') {
        $diag['problemas'][] = [
            'tipo' => 'CRITICO',
            'causa' => 'SESSION_PATH_RAIZ',
            'mensaje' => "El session path es '/' y el nombre de sesion es 'DokuWiki'. TODOS los subdominios del mismo dominio comparten el mismo nombre de sesion con path '/'. Cuando el usuario tiene abiertos 2 subdominios, la sesion de uno invalida la del otro. Al hacer login, el servidor crea una sesion. Si otro subdominio ya habia creado una sesion con el mismo nombre, se sobrescribe.",
            'solucion' => "Esto se mitiga porque DOKU_COOKIE (la cookie de autenticacion persistente) SI es unica por subdominio. Pero la sesion PHP (cookie 'DokuWiki') puede colisionar. Considerar configurar cookiedir diferente por subdominio, o verificar que session.cookie_domain este vacio (default = dominio actual).",
        ];
    }

    // CHECK 5: href en pagina web apunta a dominio diferente
    if ($diag['tiene_web']) {
        $webFiles = ['web/index.html', 'web/index.php'];
        foreach ($webFiles as $wf) {
            $fullPath = $subPath . '/' . $wf;
            if (!file_exists($fullPath)) continue;

            $content = file_get_contents($fullPath);
            if (preg_match_all('/href\s*=\s*["\']([^"\']*doku\.php[^"\']*)["\']/', $content, $m)) {
                foreach ($m[1] as $href) {
                    $parsed = parse_url($href);
                    if (!isset($parsed['host'])) continue;

                    $hrefHost = $parsed['host'];
                    $hrefParts = explode('.', $hrefHost);
                    $hrefSub = $hrefParts[0];
                    $hrefDom = count($hrefParts) >= 3 ? implode('.', array_slice($hrefParts, 1)) : $hrefHost;

                    // Si baseurl tiene un dominio diferente al href de la pagina web
                    if (!empty($config['baseurl'])) {
                        $baseParsed = parse_url($config['baseurl']);
                        $baseHost = $baseParsed['host'] ?? '';

                        if ($baseHost !== $hrefHost) {
                            $diag['problemas'][] = [
                                'tipo' => 'CRITICO',
                                'causa' => 'DOMINIO_CRUZADO',
                                'mensaje' => "El href en la pagina web apunta a '{$hrefHost}' pero el baseurl de DokuWiki es '{$baseHost}'. El usuario accede a DokuWiki desde un dominio diferente al configurado. Las cookies de sesion NO se comparten entre dominios diferentes. Esto causa doble login porque:\n  1. El navegador crea una sesion para '{$hrefHost}'\n  2. DokuWiki setea DOKU_COOKIE para el dominio del baseurl\n  3. En el siguiente request, el navegador no envia la cookie correcta",
                                'solucion' => "Sincronizar: el href en {$wf} y el baseurl en conf/local.php deben usar el MISMO dominio completo.",
                            ];
                        }
                    }
                }
            }
        }
    }

    // CHECK 6: Redireccion en index.html raiz (meta refresh + JS)
    $indexRoot = $subPath . '/index.html';
    if (file_exists($indexRoot)) {
        $indexContent = file_get_contents($indexRoot);
        if (preg_match('/meta.*http-equiv.*refresh/i', $indexContent)) {
            $diag['info'][] = "index.html raiz tiene meta refresh a web/. Esto no afecta el login pero agrega una redireccion.";
        }
    }

    // CHECK 7: Verificar si hay .htaccess que afecte cookies/sesiones
    $htaccess = $subPath . '/.htaccess';
    if (file_exists($htaccess)) {
        $htContent = file_get_contents($htaccess);
        if (preg_match('/php_value\s+session/i', $htContent)) {
            $diag['info'][] = ".htaccess tiene configuracion de sesion PHP. Esto puede afectar el comportamiento del login.";
        }
        if (preg_match('/RewriteRule.*doku\.php/i', $htContent)) {
            $diag['info'][] = ".htaccess tiene reglas de rewrite para doku.php.";
        }
    }

    // CHECK 8: Verificar preload.php (puede modificar sesiones)
    $preload = $subPath . '/inc/preload.php';
    if (file_exists($preload)) {
        $preContent = file_get_contents($preload);
        if (preg_match('/session|cookie|DOKU_COOKIE/i', $preContent)) {
            $diag['problemas'][] = [
                'tipo' => 'INFO',
                'causa' => 'PRELOAD_SESSION',
                'mensaje' => "preload.php contiene configuracion de sesion/cookie. Puede estar modificando el comportamiento del login.",
                'solucion' => "Revisar inc/preload.php manualmente.",
            ];
        }
    }

    // CHECK 9: Verificar plugins que pueden interferir con auth
    $pluginDir = $subPath . '/lib/plugins';
    $authPlugins = [];
    if (is_dir($pluginDir)) {
        $plugins = @scandir($pluginDir);
        if ($plugins) {
            foreach ($plugins as $p) {
                if ($p === '.' || $p === '..') continue;
                if (strpos($p, 'auth') !== false || strpos($p, 'login') !== false || strpos($p, 'sso') !== false) {
                    $authPlugins[] = $p;
                }
            }
        }
    }
    if (!empty($authPlugins)) {
        $diag['info'][] = "Plugins de autenticacion encontrados: " . implode(', ', $authPlugins);
    }

    return $diag;
}

// =====================================================================
//  EJECUCION
// =====================================================================

$tiempoInicio = microtime(true);

if ($modoScanAll) {
    // Escanear todos los subdominios
    $carpetas = @scandir($basePath);
    $resultados = [];
    $totalProblemas = 0;

    $excluir = ['.', '..', 'cgi-bin', '.well-known', '.trash', '.htaccess', 'respaldo', 'diagnosticos', 'tmp'];

    foreach ($carpetas as $c) {
        if (in_array($c, $excluir)) continue;
        if (!is_dir($basePath . '/' . $c)) continue;
        if (!file_exists($basePath . '/' . $c . '/doku.php')) continue;

        $r = diagnosticarLogin($basePath . '/' . $c, $c, $dominiosConocidos);
        $resultados[] = $r;
        $totalProblemas += count($r['problemas']);
    }
} else {
    // Analizar un solo subdominio
    $carpeta = basename($targetPath);
    $resultados = [];

    if (!empty($targetPath)) {
        $r = diagnosticarLogin($targetPath, $carpeta, $dominiosConocidos);
        $resultados[] = $r;
    }
}

$tiempoFin = microtime(true);
$tiempoDiag = round($tiempoFin - $tiempoInicio, 2);

// =====================================================================
//  SALIDA
// =====================================================================

if ($esCLI) {
    echo "=============================================================\n";
    echo " DIAGNOSTICO DE DOBLE LOGIN - DOKUWIKI\n";
    echo " Fecha: " . date('Y-m-d H:i:s') . "\n";
    echo "=============================================================\n\n";

    foreach ($resultados as $r) {
        echo "=== {$r['carpeta']} ===\n";
        if (!$r['existe']) { echo "  NO EXISTE\n\n"; continue; }
        if (!$r['tiene_doku']) { echo "  No es DokuWiki\n\n"; continue; }

        echo "  Config:\n";
        echo "    baseurl:      " . ($r['config']['baseurl'] ?: '(auto)') . "\n";
        echo "    basedir:      " . ($r['config']['basedir'] ?: '(auto)') . "\n";
        echo "    securecookie: " . $r['config']['securecookie'] . "\n";
        echo "    useacl:       " . $r['config']['useacl'] . "\n";
        echo "    Tiene web/:   " . ($r['tiene_web'] ? 'SI' : 'NO') . "\n";

        echo "  Cookies simuladas:\n";
        echo "    DOKU_REL:       {$r['cookie_info']['DOKU_REL']}\n";
        echo "    DOKU_COOKIE:    {$r['cookie_info']['DOKU_COOKIE']}\n";
        echo "    SESSION_PATH:   {$r['cookie_info']['SESSION_PATH']}\n";
        echo "    SESSION_NAME:   {$r['cookie_info']['SESSION_NAME']}\n";

        if (!empty($r['problemas'])) {
            echo "  PROBLEMAS:\n";
            foreach ($r['problemas'] as $p) {
                echo "    [{$p['tipo']}] {$p['causa']}: {$p['mensaje']}\n";
                if (isset($p['solucion'])) echo "      Solucion: {$p['solucion']}\n";
                echo "\n";
            }
        }

        if (!empty($r['info'])) {
            echo "  Info:\n";
            foreach ($r['info'] as $info) {
                echo "    - {$info}\n";
            }
        }
        echo "\n";
    }

    echo "Tiempo: {$tiempoDiag}s\n";

} else {
    // === SALIDA HTML ===
    ?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Diagnostico Doble Login - DokuWiki SIE</title>
<style>
    * { box-sizing: border-box; margin: 0; padding: 0; }
    body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #f1f5f9; color: #1e293b; padding: 20px; }
    .container { max-width: 1100px; margin: 0 auto; }
    h1 { font-size: 1.5em; color: #0f172a; margin-bottom: 4px; }
    .subtitle { color: #64748b; font-size: 0.9em; margin-bottom: 20px; }
    .section { background: #fff; border-radius: 10px; padding: 20px; margin-bottom: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.08); }
    .section h2 { font-size: 1.15em; margin-bottom: 14px; }
    .section h3 { font-size: 1em; color: #334155; margin: 16px 0 8px; }
    .form-bar { margin-bottom: 20px; background: #fff; border-radius: 10px; padding: 16px; box-shadow: 0 1px 3px rgba(0,0,0,0.08); display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
    .form-bar input { padding: 8px 12px; border: 1px solid #cbd5e1; border-radius: 6px; font-size: 0.9em; flex: 1; min-width: 200px; }
    .form-bar button { padding: 8px 16px; background: #2563eb; color: #fff; border: none; border-radius: 6px; cursor: pointer; }
    code { background: #f1f5f9; padding: 2px 6px; border-radius: 3px; font-size: 0.88em; }
    .config-grid { display: grid; grid-template-columns: 140px 1fr; gap: 4px 12px; font-size: 0.9em; margin-bottom: 12px; }
    .config-grid .label { color: #64748b; font-weight: 600; }
    .problem-card { border-radius: 8px; padding: 14px; margin-bottom: 10px; }
    .p-critico { background: #fef2f2; border: 1px solid #fecaca; }
    .p-medio { background: #fffbeb; border: 1px solid #fde68a; }
    .p-info { background: #f0f9ff; border: 1px solid #bae6fd; }
    .p-fatal { background: #fef2f2; border: 2px solid #ef4444; }
    .problem-card .tipo-badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 0.75em; font-weight: 700; margin-right: 6px; }
    .badge-critico { background: #fee2e2; color: #991b1b; }
    .badge-medio { background: #fef3c7; color: #92400e; }
    .badge-info { background: #dbeafe; color: #1e40af; }
    .badge-fatal { background: #fee2e2; color: #7f1d1d; }
    .problem-card .causa { font-weight: 600; font-size: 0.88em; color: #475569; }
    .problem-card .mensaje { font-size: 0.88em; margin: 6px 0; white-space: pre-wrap; }
    .problem-card .solucion { font-size: 0.85em; background: #f8fafc; padding: 10px; border-radius: 6px; margin-top: 6px; white-space: pre-wrap; }
    .info-list { list-style: none; padding: 0; }
    .info-list li { padding: 4px 0; font-size: 0.88em; color: #475569; }
    .info-list li::before { content: "ℹ️ "; }
    .cookie-grid { display: grid; grid-template-columns: 140px 1fr; gap: 4px 12px; font-size: 0.88em; background: #f8fafc; padding: 12px; border-radius: 6px; margin-bottom: 12px; }
    .cookie-grid .label { color: #64748b; font-weight: 600; }
    .explanation { background: #eff6ff; border: 1px solid #93c5fd; border-radius: 10px; padding: 16px; margin-bottom: 20px; }
    .explanation h2 { color: #1e40af; margin-bottom: 10px; }
    .explanation p { font-size: 0.9em; color: #334155; margin-bottom: 8px; }
    .explanation ol { font-size: 0.88em; color: #475569; padding-left: 20px; }
    .explanation li { margin-bottom: 4px; }
</style>
</head>
<body>
<div class="container">
    <h1>&#128274; Diagnostico de Doble Login - DokuWiki</h1>
    <p class="subtitle">Tiempo: <?= $tiempoDiag ?>s | <?= date('Y-m-d H:i:s') ?></p>

    <!-- Explicacion del problema -->
    <div class="explanation">
        <h2>&#128161; Por que ocurre el doble login?</h2>
        <p>El doble login en DokuWiki ocurre cuando el navegador no envia correctamente la cookie de sesion en el segundo request. Las causas mas frecuentes son:</p>
        <ol>
            <li><strong>Dominio cruzado:</strong> La pagina web apunta a <code>sub.systemsie.site/doku.php</code> pero el baseurl de DokuWiki es <code>sub.sistemavirtualdegestion.com</code>. Las cookies NO se comparten entre dominios diferentes.</li>
            <li><strong>baseurl incorrecto:</strong> Si <code>$conf['baseurl']</code> no coincide con la URL real del navegador, DOKU_REL se calcula diferente y la cookie cambia de nombre entre requests.</li>
            <li><strong>Session path '/':</strong> Todos los subdominios comparten el session name "DokuWiki" con path '/'. Si el usuario tiene 2 subdominios abiertos, las sesiones colisionan.</li>
            <li><strong>Mezcla HTTP/HTTPS:</strong> Con <code>securecookie=1</code>, la cookie incluye el puerto. Si un request es HTTP y el siguiente HTTPS, la cookie tiene nombre diferente.</li>
        </ol>
    </div>

    <!-- Formulario -->
    <div class="form-bar">
        <form method="get" style="display:flex;gap:10px;width:100%;align-items:center;flex-wrap:wrap;">
            <label style="font-size:0.88em;color:#64748b;">Subdominio:</label>
            <input type="text" name="sub" placeholder="Nombre o URL (ej: aywgonzalez o https://aywgonzalez.sistemavirtualdegestion.com)" value="<?= htmlspecialchars($_GET['sub'] ?? '') ?>">
            <button type="submit">Diagnosticar</button>
        </form>
    </div>

    <?php if (empty($resultados)): ?>
    <div class="section" style="text-align:center;color:#64748b;padding:40px;">
        <p>Ingrese el nombre de un subdominio para diagnosticar.</p>
        <p style="font-size:0.85em;margin-top:8px;">O ejecute desde CLI: <code>php diagnostico_login.php --scan</code> para analizar todos.</p>
    </div>
    <?php else: ?>

    <?php foreach ($resultados as $r): ?>
    <div class="section">
        <h2>&#128193; <?= htmlspecialchars($r['carpeta']) ?></h2>

        <?php if (!$r['existe'] || !$r['tiene_doku']): ?>
            <p style="color:#dc2626;">
                <?= !$r['existe'] ? 'Carpeta no existe' : 'No es un sistema DokuWiki' ?>
            </p>
            <?php continue; ?>
        <?php endif; ?>

        <!-- Configuracion -->
        <h3>Configuracion DokuWiki</h3>
        <div class="config-grid">
            <div class="label">baseurl</div>
            <div><code><?= htmlspecialchars($r['config']['baseurl'] ?: '(auto-detect)') ?></code></div>
            <div class="label">basedir</div>
            <div><code><?= htmlspecialchars($r['config']['basedir'] ?: '(auto-detect)') ?></code></div>
            <div class="label">securecookie</div>
            <div><code><?= $r['config']['securecookie'] ?></code></div>
            <div class="label">useacl</div>
            <div><code><?= $r['config']['useacl'] ?></code></div>
            <div class="label">rememberme</div>
            <div><code><?= $r['config']['rememberme'] ?></code></div>
            <div class="label">Tiene web/</div>
            <div><?= $r['tiene_web'] ? '&#9989; Si' : '&#10060; No' ?></div>
        </div>

        <!-- Cookies simuladas -->
        <h3>Cookies y sesion (calculadas)</h3>
        <div class="cookie-grid">
            <div class="label">DOKU_REL</div>
            <div><code><?= htmlspecialchars($r['cookie_info']['DOKU_REL']) ?></code></div>
            <div class="label">DOKU_COOKIE</div>
            <div><code><?= htmlspecialchars($r['cookie_info']['DOKU_COOKIE']) ?></code></div>
            <div class="label">SESSION_PATH</div>
            <div><code><?= htmlspecialchars($r['cookie_info']['SESSION_PATH']) ?></code></div>
            <div class="label">SESSION_NAME</div>
            <div><code><?= htmlspecialchars($r['cookie_info']['SESSION_NAME']) ?></code></div>
        </div>

        <!-- Problemas -->
        <?php if (!empty($r['problemas'])): ?>
        <h3>&#9888;&#65039; Problemas detectados (<?= count($r['problemas']) ?>)</h3>
        <?php foreach ($r['problemas'] as $p): ?>
            <?php
            $cardClass = 'p-info';
            $badgeClass = 'badge-info';
            if ($p['tipo'] === 'CRITICO') { $cardClass = 'p-critico'; $badgeClass = 'badge-critico'; }
            elseif ($p['tipo'] === 'MEDIO') { $cardClass = 'p-medio'; $badgeClass = 'badge-medio'; }
            elseif ($p['tipo'] === 'FATAL') { $cardClass = 'p-fatal'; $badgeClass = 'badge-fatal'; }
            ?>
            <div class="problem-card <?= $cardClass ?>">
                <span class="tipo-badge <?= $badgeClass ?>"><?= $p['tipo'] ?></span>
                <span class="causa"><?= htmlspecialchars($p['causa'] ?? '') ?></span>
                <div class="mensaje"><?= htmlspecialchars($p['mensaje']) ?></div>
                <?php if (isset($p['solucion'])): ?>
                    <div class="solucion"><strong>Solucion:</strong> <?= htmlspecialchars($p['solucion']) ?></div>
                <?php endif; ?>
            </div>
        <?php endforeach; ?>
        <?php else: ?>
            <div style="background:#f0fdf4;border:1px solid #86efac;border-radius:8px;padding:12px;color:#166534;margin-top:12px;">
                &#9989; No se detectaron problemas de configuracion que causen doble login.
            </div>
        <?php endif; ?>

        <!-- Info adicional -->
        <?php if (!empty($r['info'])): ?>
        <h3>Informacion adicional</h3>
        <ul class="info-list">
            <?php foreach ($r['info'] as $info): ?>
                <li><?= htmlspecialchars($info) ?></li>
            <?php endforeach; ?>
        </ul>
        <?php endif; ?>
    </div>
    <?php endforeach; ?>

    <?php endif; ?>

    <!-- Test en vivo desde el navegador -->
    <div class="section">
        <h2>&#128295; Test en vivo (ejecutar desde el navegador del subdominio)</h2>
        <p style="font-size:0.9em;color:#475569;margin-bottom:12px;">
            Copie el siguiente codigo y coloquelo como <code>test_cookies.php</code> en la raiz del subdominio con problema.
            Luego acceda desde el navegador para ver el estado real de las cookies y sesion.
        </p>
        <pre style="background:#1e293b;color:#e2e8f0;padding:16px;border-radius:8px;font-size:0.82em;overflow-x:auto;white-space:pre-wrap;">&lt;?php
/**
 * Test en vivo de cookies/sesion DokuWiki
 * Colocar en la raiz del subdominio y acceder desde el navegador.
 */
error_reporting(E_ALL);
ini_set('display_errors', 1);

echo "&lt;h1&gt;Test de Cookies y Sesion - DokuWiki&lt;/h1&gt;";
echo "&lt;pre&gt;";

// Cargar config de DokuWiki
if (!defined('DOKU_INC')) define('DOKU_INC', __DIR__ . '/');
$conf = [];
if (file_exists(DOKU_INC . 'conf/dokuwiki.php')) include(DOKU_INC . 'conf/dokuwiki.php');
if (file_exists(DOKU_INC . 'conf/local.php')) include(DOKU_INC . 'conf/local.php');
if (file_exists(DOKU_INC . 'conf/local_act.php')) include(DOKU_INC . 'conf/local_act.php');

echo "=== CONFIGURACION ===\n";
echo "baseurl:      " . ($conf['baseurl'] ?? '(no definido)') . "\n";
echo "basedir:      " . ($conf['basedir'] ?? '(no definido)') . "\n";
echo "securecookie: " . ($conf['securecookie'] ?? '(default)') . "\n";
echo "cookiedir:    " . ($conf['cookiedir'] ?? '(no definido)') . "\n\n";

echo "=== URL ACTUAL ===\n";
$scheme = (!empty($_SERVER['HTTPS']) &amp;&amp; $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
echo "Scheme:       {$scheme}\n";
echo "Host:         " . ($_SERVER['HTTP_HOST'] ?? '?') . "\n";
echo "Request URI:  " . ($_SERVER['REQUEST_URI'] ?? '?') . "\n";
echo "Server Port:  " . ($_SERVER['SERVER_PORT'] ?? '?') . "\n";
echo "DOCUMENT_ROOT: " . ($_SERVER['DOCUMENT_ROOT'] ?? '?') . "\n\n";

// Simular DOKU_REL
$basedir = $conf['basedir'] ?? '';
if (!empty($basedir)) {
    $dokuRel = ($basedir[0] !== '/' ? '/' : '') . rtrim($basedir, '/') . '/';
} else {
    $dokuRel = dirname($_SERVER['SCRIPT_NAME']) . '/';
}
echo "=== COOKIES CALCULADAS ===\n";
echo "DOKU_REL (simulado): {$dokuRel}\n";
$securecookie = $conf['securecookie'] ?? 1;
$port = $securecookie ? ($_SERVER['SERVER_PORT'] ?? '') : '';
$cookieName = 'DW' . md5($dokuRel . $port);
echo "DOKU_COOKIE (simulado): {$cookieName}\n";
$cookieDir = empty($conf['cookiedir']) ? $dokuRel : $conf['cookiedir'];
echo "Session path: {$cookieDir}\n";
echo "Session name: DokuWiki\n\n";

echo "=== COOKIES RECIBIDAS ===\n";
foreach ($_COOKIE as $name => $val) {
    $display = (strlen($val) > 60) ? substr($val, 0, 60) . '...' : $val;
    echo "{$name} = {$display}\n";
}
if (empty($_COOKIE)) echo "(ninguna cookie recibida)\n";

echo "\n=== SESION ===\n";
session_name('DokuWiki');
session_start();
echo "Session ID: " . session_id() . "\n";
echo "Session data keys: " . implode(', ', array_keys($_SESSION)) . "\n";
if (isset($_SESSION[$cookieName])) {
    echo "Session[DOKU_COOKIE] existe: SI\n";
    if (isset($_SESSION[$cookieName]['auth'])) {
        echo "  auth.user: " . ($_SESSION[$cookieName]['auth']['user'] ?? '?') . "\n";
        echo "  auth.time: " . ($_SESSION[$cookieName]['auth']['time'] ?? '?') . "\n";
    }
} else {
    echo "Session[DOKU_COOKIE] existe: NO\n";
    echo "  Buscando otras claves DW en sesion...\n";
    foreach (array_keys($_SESSION) as $k) {
        if (strpos($k, 'DW') === 0) echo "  Encontrado: {$k}\n";
    }
}
echo "&lt;/pre&gt;";
echo "&lt;p&gt;&lt;strong&gt;IMPORTANTE:&lt;/strong&gt; Borrar este archivo despues de usarlo.&lt;/p&gt;";</pre>
    </div>
</div>
</body>
</html>
    <?php
}
