<?php
/**
 * VERIFICADOR DE BASEDIR/BASEURL - SUBDOMINIOS SIE
 * ==================================================
 * Detecta subdominios donde DokuWiki se muestra sin formato (CSS no carga)
 * porque basedir esta mal configurado.
 *
 * PROBLEMA: Cuando basedir = '/nombre_subdominio/' en vez de '/',
 * DokuWiki genera URLs como:
 *   https://sub.dominio.com/sub/lib/exe/css.php  (RUTA DUPLICADA -> 404/503)
 * en vez de:
 *   https://sub.dominio.com/lib/exe/css.php       (CORRECTO)
 *
 * Esto ocurre porque el subdominio YA resuelve a la carpeta del subdominio
 * en el servidor (via DocumentRoot o subdominio de cPanel), entonces
 * basedir debe ser '/' (raiz del subdominio), no '/carpeta/'.
 *
 * Tambien detecta:
 *   - baseurl apuntando a dominio incorrecto
 *   - baseurl usando HTTP en vez de HTTPS
 *   - template configurado que no existe
 *   - archivos criticos del template faltantes
 *
 * USO:
 *   Navegador: sin parametros (escanea todos) o ?sub=nombre
 *   CLI: php verificar_basedir.php [--scan | nombre]
 */

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

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

$dominiosConocidos = [
    'sistemavirtualdegestion.com',
    'systemsie.site',
    'susprofesionales.com',
    'sieasesorias.com',
    'gestioncontrolada.com',
];

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

// =====================================================================
//  DETECCION DE MODO
// =====================================================================

$esCLI = (php_sapi_name() === 'cli');
$modoScanAll = false;
$targetSub = '';

if ($esCLI) {
    if (!isset($argv[1]) || $argv[1] === '--scan') {
        $modoScanAll = true;
    } else {
        $targetSub = $argv[1];
    }
} else {
    header('Content-Type: text/html; charset=UTF-8');
    if (isset($_GET['sub']) && !empty($_GET['sub'])) {
        $subParam = trim($_GET['sub']);
        if (preg_match('#^https?://#i', $subParam)) {
            $parsed = parse_url($subParam);
            if (isset($parsed['host'])) {
                $parts = explode('.', $parsed['host']);
                $subParam = $parts[0];
            }
        }
        $targetSub = basename(preg_replace('/[^a-zA-Z0-9._-]/', '', $subParam));
    } else {
        $modoScanAll = true;
    }
}

// =====================================================================
//  FUNCIONES
// =====================================================================

function leerConfigCompleta($subPath)
{
    $config = [
        'baseurl'       => '',
        'basedir'       => '',
        'template'      => '',
        'title'         => '',
        'cookiedir'     => '',
        'securecookie'  => 1,
    ];

    foreach (['conf/dokuwiki.php', 'conf/local.php', 'conf/local_act.php'] as $confFile) {
        $path = $subPath . '/' . $confFile;
        if (!file_exists($path)) continue;
        $content = @file_get_contents($path);
        if ($content === false) continue;

        // Valores string
        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[2][$i];
                }
            }
        }
        // Valores numericos
        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;
}

function verificarSubdominio($subPath, $carpeta, $dominiosConocidos)
{
    $r = [
        'carpeta'       => $carpeta,
        'existe'        => false,
        'tiene_doku'    => false,
        'config'        => [],
        'problemas'     => [],
        'estado'        => 'OK',
    ];

    if (!is_dir($subPath)) return $r;
    $r['existe'] = true;

    if (!file_exists($subPath . '/doku.php')) return $r;
    $r['tiene_doku'] = true;

    $config = leerConfigCompleta($subPath);
    $r['config'] = $config;

    // ============================================
    // CHECK 1: basedir DEBE ser explicitamente '/'
    // ============================================
    $basedir = $config['basedir'];

    // Verificar si basedir esta definido explicitamente en los archivos de config
    $basedirExplicito = false;
    foreach (['conf/local.php', 'conf/local_act.php'] as $confFile) {
        $cfPath = $subPath . '/' . $confFile;
        if (!file_exists($cfPath)) continue;
        $cfContent = @file_get_contents($cfPath);
        if ($cfContent !== false && preg_match("/\\\$conf\['basedir'\]/", $cfContent)) {
            $basedirExplicito = true;
            break;
        }
    }

    if (!$basedirExplicito || empty($basedir)) {
        // basedir NO esta definido -> DokuWiki auto-detecta y puede generar /carpeta/
        $r['problemas'][] = [
            'tipo'     => 'BASEDIR_NO_DEFINIDO',
            'gravedad' => 'CRITICO',
            'mensaje'  => "basedir no esta definido explicitamente. DokuWiki auto-detecta DOKU_REL como '/{$carpeta}/' lo que duplica la ruta y causa error 503 en CSS/JS.",
            'efecto'   => 'CSS y JS no cargan -> sistema sin formato visual',
            'solucion' => "Agregar \$conf['basedir'] = '/'; en conf/local.php",
        ];
    } elseif ($basedir !== '/') {
        $bdClean = '/' . trim($basedir, '/') . '/';
        $carpetaPath = '/' . $carpeta . '/';

        // Caso critico: basedir = /nombre_subdominio/ (duplica la ruta)
        if (strtolower($bdClean) === strtolower($carpetaPath)) {
            $r['problemas'][] = [
                'tipo'     => 'BASEDIR_DUPLICADO',
                'gravedad' => 'CRITICO',
                'mensaje'  => "basedir = '{$basedir}' duplica la ruta del subdominio. Los CSS/JS se buscan en /{$carpeta}/lib/... que no existe.",
                'efecto'   => 'CSS y JS no cargan -> sistema sin formato visual',
                'solucion' => "Cambiar \$conf['basedir'] = '/'; en conf/local.php (o conf/local_act.php)",
            ];
        } else {
            // basedir es algo diferente a / pero no es el nombre de la carpeta
            $r['problemas'][] = [
                'tipo'     => 'BASEDIR_NO_RAIZ',
                'gravedad' => 'MEDIO',
                'mensaje'  => "basedir = '{$basedir}' (no es '/'). Verificar que sea correcto para este subdominio.",
                'efecto'   => 'Posible error en rutas de CSS/JS',
                'solucion' => "Si el subdominio apunta directamente a la carpeta, usar basedir = '/'",
            ];
        }
    }

    // ============================================
    // CHECK 2: baseurl subdominio incorrecto
    // ============================================
    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;

            if ($subEnConfig !== $carpeta) {
                $r['problemas'][] = [
                    'tipo'     => 'BASEURL_SUBDOMINIO',
                    'gravedad' => 'CRITICO',
                    'mensaje'  => "baseurl tiene subdominio '{$subEnConfig}' pero carpeta es '{$carpeta}'.",
                    'efecto'   => 'Cookies y sesiones se setean para el dominio equivocado',
                    'solucion' => "Cambiar baseurl a 'https://{$carpeta}.{$domEnConfig}/'",
                ];
            }

            // Verificar HTTPS
            $scheme = $parsed['scheme'] ?? 'http';
            if ($scheme !== 'https') {
                $r['problemas'][] = [
                    'tipo'     => 'BASEURL_HTTP',
                    'gravedad' => 'MEDIO',
                    'mensaje'  => "baseurl usa '{$scheme}://' en vez de 'https://'.",
                    'efecto'   => 'Puede causar problemas con securecookie y mixed content',
                    'solucion' => "Cambiar baseurl a usar https://",
                ];
            }

            // Verificar dominio valido
            if (!in_array($domEnConfig, $dominiosConocidos)) {
                $r['problemas'][] = [
                    'tipo'     => 'BASEURL_DOMINIO',
                    'gravedad' => 'MEDIO',
                    'mensaje'  => "baseurl usa dominio '{$domEnConfig}' que no esta en la lista de dominios conocidos.",
                    'efecto'   => 'Posible dominio incorrecto',
                    'solucion' => "Verificar que el dominio sea correcto.",
                ];
            }
        }

        // Verificar path duplicado en baseurl
        if (isset($parsed['path'])) {
            $urlPath = trim($parsed['path'], '/');
            if (strtolower($urlPath) === strtolower($carpeta)) {
                $r['problemas'][] = [
                    'tipo'     => 'BASEURL_PATH_DUPLICADO',
                    'gravedad' => 'CRITICO',
                    'mensaje'  => "baseurl incluye '/{$carpeta}/' en el path. Como es un subdominio, el path debe ser solo '/'.",
                    'efecto'   => 'Rutas de CSS/JS duplicadas -> no cargan',
                    'solucion' => "Cambiar baseurl a 'https://{$parsed['host']}/' (sin /{$carpeta}/)",
                ];
            }
        }
    }

    // ============================================
    // CHECK 3: Template existe
    // ============================================
    $template = $config['template'] ?: 'dokuwiki';
    $tplPath = $subPath . '/lib/tpl/' . $template;
    if (!is_dir($tplPath)) {
        $r['problemas'][] = [
            'tipo'     => 'TEMPLATE_NO_EXISTE',
            'gravedad' => 'CRITICO',
            'mensaje'  => "Template '{$template}' no existe en lib/tpl/.",
            'efecto'   => 'Sistema sin formato visual',
            'solucion' => "Copiar template '{$template}' o cambiar a uno existente.",
        ];
    } else {
        // Verificar archivos criticos
        $criticos = ['main.php', 'style.ini'];
        foreach ($criticos as $archivo) {
            if (!file_exists($tplPath . '/' . $archivo)) {
                $r['problemas'][] = [
                    'tipo'     => 'TEMPLATE_ARCHIVO_FALTANTE',
                    'gravedad' => 'CRITICO',
                    'mensaje'  => "Falta {$archivo} en template '{$template}'.",
                    'efecto'   => 'Template no puede renderizar correctamente',
                    'solucion' => "Copiar {$archivo} del template original.",
                ];
            }
        }

        // Verificar que css/ exista
        if (!is_dir($tplPath . '/css')) {
            $r['problemas'][] = [
                'tipo'     => 'TEMPLATE_SIN_CSS',
                'gravedad' => 'CRITICO',
                'mensaje'  => "Falta carpeta css/ en template '{$template}'.",
                'efecto'   => 'No hay estilos CSS',
                'solucion' => "Copiar carpeta css/ del template original.",
            ];
        }
    }

    // ============================================
    // CHECK 4: Cache escribible
    // ============================================
    $cacheDir = $subPath . '/data/cache';
    if (is_dir($cacheDir) && !is_writable($cacheDir)) {
        $r['problemas'][] = [
            'tipo'     => 'CACHE_NO_ESCRIBIBLE',
            'gravedad' => 'MEDIO',
            'mensaje'  => 'data/cache/ no tiene permisos de escritura.',
            'efecto'   => 'DokuWiki no puede cachear CSS compilados',
            'solucion' => 'chmod 777 data/cache/',
        ];
    }

    // Determinar estado
    foreach ($r['problemas'] as $p) {
        if ($p['gravedad'] === 'CRITICO') { $r['estado'] = 'CRITICO'; break; }
        if ($p['gravedad'] === 'MEDIO') { $r['estado'] = 'MEDIO'; }
    }

    return $r;
}

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

$tiempoInicio = microtime(true);
$resultados = [];

if ($modoScanAll) {
    $carpetas = @scandir($basePath);
    if (!$carpetas) {
        echo $esCLI ? "ERROR: No se puede leer {$basePath}\n" : "<p style='color:red'>ERROR</p>";
        exit(1);
    }
    foreach ($carpetas as $c) {
        if (in_array($c, $excluir)) continue;
        if (!is_dir($basePath . '/' . $c)) continue;
        if (!file_exists($basePath . '/' . $c . '/doku.php')) continue;
        $resultados[] = verificarSubdominio($basePath . '/' . $c, $c, $dominiosConocidos);
    }
} else {
    $resultados[] = verificarSubdominio($basePath . '/' . $targetSub, $targetSub, $dominiosConocidos);
}

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

// Estadisticas
$totalOK = 0; $totalCritico = 0; $totalMedio = 0;
$erroresPorTipo = [];
$listaCriticos = [];

foreach ($resultados as $r) {
    if (!$r['tiene_doku']) continue;
    if ($r['estado'] === 'OK') $totalOK++;
    elseif ($r['estado'] === 'CRITICO') { $totalCritico++; $listaCriticos[] = $r; }
    elseif ($r['estado'] === 'MEDIO') $totalMedio++;
    foreach ($r['problemas'] as $p) {
        $t = $p['tipo'];
        if (!isset($erroresPorTipo[$t])) $erroresPorTipo[$t] = [];
        $erroresPorTipo[$t][] = $r['carpeta'];
    }
}

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

if ($esCLI) {
    echo "=============================================================\n";
    echo " VERIFICADOR BASEDIR/BASEURL - SUBDOMINIOS SIE\n";
    echo " " . date('Y-m-d H:i:s') . " | Tiempo: {$tiempoDiag}s\n";
    echo "=============================================================\n\n";

    echo "OK: {$totalOK} | CRITICO: {$totalCritico} | MEDIO: {$totalMedio}\n\n";

    if (!empty($erroresPorTipo)) {
        echo "=== RESUMEN POR TIPO DE ERROR ===\n";
        foreach ($erroresPorTipo as $tipo => $subs) {
            echo "  {$tipo} (" . count($subs) . "): " . implode(', ', array_slice($subs, 0, 10));
            if (count($subs) > 10) echo " +" . (count($subs) - 10) . " mas";
            echo "\n";
        }
        echo "\n";
    }

    if ($totalCritico > 0) {
        echo "=== SISTEMAS SIN FORMATO (CRITICO) ===\n\n";
        foreach ($listaCriticos as $r) {
            echo "--- {$r['carpeta']} ---\n";
            echo "  basedir:  {$r['config']['basedir']}\n";
            echo "  baseurl:  {$r['config']['baseurl']}\n";
            echo "  template: {$r['config']['template']}\n";
            foreach ($r['problemas'] as $p) {
                echo "  [{$p['gravedad']}] {$p['tipo']}: {$p['mensaje']}\n";
            }
            echo "\n";
        }
    }
} else {
    // === HTML ===
    ?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Verificador Basedir/Baseurl - 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: 1200px; margin: 0 auto; }
    h1 { font-size: 1.5em; color: #0f172a; margin-bottom: 4px; }
    .subtitle { color: #64748b; font-size: 0.9em; margin-bottom: 20px; }
    .summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 12px; margin-bottom: 24px; }
    .summary-card { background: #fff; border-radius: 10px; padding: 16px; text-align: center; box-shadow: 0 1px 3px rgba(0,0,0,0.08); }
    .summary-card .num { font-size: 2em; font-weight: 700; }
    .summary-card .label { font-size: 0.82em; color: #64748b; }
    .num-green { color: #16a34a; } .num-red { color: #dc2626; } .num-yellow { color: #d97706; } .num-blue { color: #2563eb; }
    .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: 12px; }
    .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; }
    .form-bar a.btn { padding: 8px 16px; background: #16a34a; color: #fff; border-radius: 6px; text-decoration: none; font-size: 0.9em; }
    .error-card { border-radius: 10px; padding: 16px; margin-bottom: 12px; border: 1px solid #fecaca; background: #fef2f2; }
    .error-card .header { display: flex; align-items: center; gap: 10px; margin-bottom: 10px; flex-wrap: wrap; }
    .error-card .sub-name { font-weight: 700; font-size: 1.1em; }
    .error-card .config-line { font-size: 0.82em; color: #64748b; }
    .error-card .config-line code { background: #fee2e2; padding: 1px 5px; border-radius: 3px; color: #991b1b; }
    .error-card .config-line code.ok { background: #dcfce7; color: #166534; }
    .problem { margin-top: 6px; padding: 10px 12px; background: #fff; border-radius: 6px; border: 1px solid #fde2e2; font-size: 0.88em; }
    .problem .tipo { display: inline-block; padding: 1px 6px; border-radius: 4px; font-size: 0.75em; font-weight: 700; margin-right: 4px; }
    .tipo-critico { background: #fee2e2; color: #991b1b; }
    .tipo-medio { background: #fef3c7; color: #92400e; }
    .problem .efecto { font-size: 0.82em; color: #dc2626; margin-top: 2px; }
    .problem .sol { font-size: 0.82em; color: #166534; background: #f0fdf4; padding: 6px 8px; border-radius: 4px; margin-top: 4px; font-family: monospace; }
    table { width: 100%; border-collapse: collapse; font-size: 0.88em; }
    table th { text-align: left; padding: 8px; border-bottom: 2px solid #e2e8f0; color: #475569; }
    table td { padding: 8px; border-bottom: 1px solid #f1f5f9; }
    table tr:hover { background: #f8fafc; }
    .badge { display: inline-block; padding: 1px 6px; border-radius: 4px; font-size: 0.78em; font-weight: 600; }
    .badge-ok { background: #dcfce7; color: #166534; }
    .badge-err { background: #fee2e2; color: #991b1b; }
    .badge-warn { background: #fef3c7; color: #92400e; }
    code { background: #f1f5f9; padding: 1px 5px; border-radius: 3px; font-size: 0.88em; }
    .filter-bar { margin-bottom: 12px; display: flex; gap: 8px; align-items: center; }
    .filter-bar select, .filter-bar input { padding: 6px 10px; border: 1px solid #cbd5e1; border-radius: 6px; }
    .filter-bar input { width: 220px; }
    .explain { background: #eff6ff; border: 1px solid #93c5fd; border-radius: 10px; padding: 16px; margin-bottom: 20px; }
    .explain h2 { color: #1e40af; margin-bottom: 8px; font-size: 1.1em; }
    .explain p { font-size: 0.9em; color: #334155; margin-bottom: 6px; }
    .explain code { background: #dbeafe; color: #1e40af; }
    .tipo-resumen { margin-bottom: 10px; padding: 10px 14px; background: #fef2f2; border-radius: 8px; border: 1px solid #fecaca; }
    .tipo-resumen .tipo-name { font-weight: 700; color: #991b1b; }
    .tipo-resumen .tipo-count { font-weight: 700; font-size: 1.2em; color: #dc2626; }
    .tipo-resumen .subs { font-size: 0.82em; color: #64748b; margin-top: 4px; word-break: break-all; }
</style>
</head>
<body>
<div class="container">
    <h1>&#128269; Verificador de Basedir / Baseurl</h1>
    <p class="subtitle"><?= date('Y-m-d H:i:s') ?> | Tiempo: <?= $tiempoDiag ?>s | Subdominios: <?= count($resultados) ?></p>

    <!-- Explicacion -->
    <div class="explain">
        <h2>&#128161; Problema: Sistema sin formato (CSS no carga)</h2>
        <p><strong>Caso 1:</strong> Cuando <code>basedir = '/nombre_subdominio/'</code> DokuWiki genera URLs duplicadas.</p>
        <p><strong>Caso 2:</strong> Cuando <code>basedir</code> <strong>no esta definido</strong>, DokuWiki auto-detecta <code>DOKU_REL</code> como <code>/nombre_subdominio/</code> (porque el DocumentRoot del servidor es <code>/home/systeng3/public_html/</code>), generando el mismo error.</p>
        <p>&#10060; <code>https://sub.dominio.com/<strong>sub</strong>/lib/exe/css.php</code> → 503/404</p>
        <p>&#9989; <code>https://sub.dominio.com/lib/exe/css.php</code> → 200 OK</p>
        <p><strong>Solucion:</strong> Todos los sistemas deben tener explicitamente <code>$conf['basedir'] = '/';</code> en <code>conf/local.php</code>.</p>
    </div>

    <!-- Formulario -->
    <div class="form-bar">
        <form method="get" style="display:flex;gap:10px;flex:1;align-items:center;flex-wrap:wrap;">
            <label style="font-size:0.88em;color:#64748b;">Subdominio:</label>
            <input type="text" name="sub" placeholder="Nombre (ej: darwinsanchez) o vacio para todos" value="<?= htmlspecialchars($_GET['sub'] ?? '') ?>">
            <button type="submit">Verificar</button>
        </form>
        <?php if (!empty($_GET['sub'])): ?>
            <a class="btn" href="?">Escanear todos</a>
        <?php endif; ?>
    </div>

    <!-- Resumen -->
    <div class="summary">
        <div class="summary-card"><div class="num num-blue"><?= count($resultados) ?></div><div class="label">Subdominios</div></div>
        <div class="summary-card"><div class="num num-green"><?= $totalOK ?></div><div class="label">OK</div></div>
        <div class="summary-card"><div class="num <?= $totalCritico > 0 ? 'num-red' : 'num-green' ?>"><?= $totalCritico ?></div><div class="label">Sin formato (critico)</div></div>
        <div class="summary-card"><div class="num <?= $totalMedio > 0 ? 'num-yellow' : 'num-green' ?>"><?= $totalMedio ?></div><div class="label">Advertencias</div></div>
    </div>

    <?php if (!empty($erroresPorTipo)): ?>
    <!-- Resumen por tipo -->
    <div class="section">
        <h2>&#128202; Resumen por tipo de error</h2>
        <?php foreach ($erroresPorTipo as $tipo => $subs): ?>
            <div class="tipo-resumen">
                <span class="tipo-name"><?= htmlspecialchars($tipo) ?></span>
                <span class="tipo-count"><?= count($subs) ?></span> subdominios
                <div class="subs"><?= htmlspecialchars(implode(', ', $subs)) ?></div>
            </div>
        <?php endforeach; ?>
    </div>
    <?php endif; ?>

    <?php if ($totalCritico > 0): ?>
    <!-- Errores criticos -->
    <div class="section">
        <h2>&#9888;&#65039; Sistemas sin formato - CRITICO (<?= $totalCritico ?>)</h2>
        <?php foreach ($listaCriticos as $r): ?>
            <div class="error-card">
                <div class="header">
                    <span class="sub-name"><?= htmlspecialchars($r['carpeta']) ?></span>
                    <span class="badge badge-err">SIN FORMATO</span>
                </div>
                <div class="config-line">
                    basedir: <code><?= htmlspecialchars($r['config']['basedir'] ?: '(vacio)') ?></code> |
                    baseurl: <code><?= htmlspecialchars($r['config']['baseurl'] ?: '(vacio)') ?></code> |
                    template: <code><?= htmlspecialchars($r['config']['template'] ?: '(default)') ?></code>
                </div>
                <?php foreach ($r['problemas'] as $p): ?>
                    <div class="problem">
                        <span class="tipo <?= $p['gravedad'] === 'CRITICO' ? 'tipo-critico' : 'tipo-medio' ?>"><?= $p['gravedad'] ?></span>
                        <strong><?= htmlspecialchars($p['tipo']) ?></strong>:
                        <?= htmlspecialchars($p['mensaje']) ?>
                        <div class="efecto">&#9889; <?= htmlspecialchars($p['efecto']) ?></div>
                        <div class="sol">&#128295; <?= htmlspecialchars($p['solucion']) ?></div>
                    </div>
                <?php endforeach; ?>
            </div>
        <?php endforeach; ?>
    </div>
    <?php endif; ?>

    <!-- Tabla completa -->
    <div class="section">
        <h2>&#128203; Detalle completo</h2>
        <div class="filter-bar">
            <input type="text" id="filtro" placeholder="Buscar subdominio..." oninput="filtrar()">
            <select id="filtroEstado" onchange="filtrar()">
                <option value="">Todos</option>
                <option value="CRITICO">Solo criticos</option>
                <option value="MEDIO">Solo advertencias</option>
                <option value="OK">Solo OK</option>
            </select>
        </div>
        <table id="tabla">
            <thead><tr><th>#</th><th>Subdominio</th><th>basedir</th><th>baseurl</th><th>Template</th><th>Estado</th></tr></thead>
            <tbody>
            <?php $i = 0; foreach ($resultados as $r): ?>
                <?php if (!$r['tiene_doku']) continue; $i++; ?>
                <?php
                $bc = 'badge-ok'; $bt = 'OK';
                if ($r['estado'] === 'CRITICO') { $bc = 'badge-err'; $bt = 'CRITICO'; }
                elseif ($r['estado'] === 'MEDIO') { $bc = 'badge-warn'; $bt = 'MEDIO'; }
                ?>
                <tr data-nombre="<?= strtolower($r['carpeta']) ?>" data-estado="<?= $r['estado'] ?>">
                    <td><?= $i ?></td>
                    <td><strong><?= htmlspecialchars($r['carpeta']) ?></strong></td>
                    <td><code style="<?= ($r['config']['basedir'] !== '/' && !empty($r['config']['basedir'])) ? 'color:#dc2626;background:#fee2e2;' : '' ?>"><?= htmlspecialchars($r['config']['basedir'] ?: '/') ?></code></td>
                    <td style="max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;"><code style="font-size:0.82em;"><?= htmlspecialchars($r['config']['baseurl'] ?: '(auto)') ?></code></td>
                    <td><code><?= htmlspecialchars($r['config']['template'] ?: 'default') ?></code></td>
                    <td><span class="badge <?= $bc ?>"><?= $bt ?></span></td>
                </tr>
            <?php endforeach; ?>
            </tbody>
        </table>
    </div>
</div>

<script>
function filtrar() {
    var texto = document.getElementById('filtro').value.toLowerCase();
    var estado = document.getElementById('filtroEstado').value;
    document.querySelectorAll('#tabla tbody tr').forEach(function(f) {
        var mostrar = true;
        if (texto && f.getAttribute('data-nombre').indexOf(texto) === -1) mostrar = false;
        if (estado && f.getAttribute('data-estado') !== estado) mostrar = false;
        f.style.display = mostrar ? '' : 'none';
    });
}
</script>
</body>
</html>
    <?php
}
