<?php
/**
 * VERIFICADOR DE TEMPLATES - SUBDOMINIOS SIE
 * ============================================
 * Detecta subdominios donde DokuWiki se muestra sin formato (HTML crudo)
 * porque el template no existe, esta incompleto, o esta mal configurado.
 *
 * Verifica:
 *   1. Que el template configurado en conf/local.php exista en lib/tpl/
 *   2. Que los archivos criticos del template esten presentes (main.php, style.ini, css/)
 *   3. Que style.ini sea parseable y referencie archivos CSS/LESS existentes
 *   4. Que la cache de DokuWiki no este corrupta
 *   5. Permisos de lectura en archivos del template
 *
 * USO:
 *   Navegador: ?sub=nombre  (un subdominio) o sin parametros (escanea todos)
 *   CLI: php verificar_templates.php [--scan | nombre_subdominio]
 */

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

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

// Templates validos del sistema SIE
$templatesValidos = ['20cones', '21cones'];

// Archivos criticos que DEBEN existir en un template funcional
$archivosCriticos = [
    'main.php'       => 'Archivo principal del template (renderiza la pagina)',
    'style.ini'      => 'Configuracion de estilos CSS/LESS',
    'detail.php'     => 'Vista de detalle de imagenes',
];

// Directorios criticos
$directoriosCriticos = [
    'css'     => 'Carpeta de hojas de estilo',
    'images'  => 'Carpeta de imagenes del template',
];

// Carpetas/archivos a excluir del escaneo
$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 verificarTemplate($subPath, $carpeta, $templatesValidos, $archivosCriticos, $directoriosCriticos)
{
    $resultado = [
        'carpeta'           => $carpeta,
        'existe'            => false,
        'tiene_doku'        => false,
        'template_config'   => '',
        'template_existe'   => false,
        'estado'            => 'OK', // OK, ERROR, ADVERTENCIA
        'problemas'         => [],
        'advertencias'      => [],
        'archivos_faltantes' => [],
        'css_faltantes'     => [],
        'info'              => [],
    ];

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

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

    // 1. Leer template configurado
    $templateConfig = '';
    foreach (['conf/local.php', 'conf/local_act.php'] as $confFile) {
        $confPath = $subPath . '/' . $confFile;
        if (!file_exists($confPath)) continue;
        $content = @file_get_contents($confPath);
        if ($content === false) continue;
        if (preg_match("/\\\$conf\['template'\]\s*=\s*'([^']+)'/", $content, $m)) {
            $templateConfig = $m[1];
        }
    }

    // Si no hay template configurado, usar default de DokuWiki
    if (empty($templateConfig)) {
        // Leer dokuwiki.php para el default
        $dokuConf = $subPath . '/conf/dokuwiki.php';
        if (file_exists($dokuConf)) {
            $content = @file_get_contents($dokuConf);
            if (preg_match("/\\\$conf\['template'\]\s*=\s*'([^']+)'/", $content, $m)) {
                $templateConfig = $m[1];
            }
        }
        if (empty($templateConfig)) {
            $templateConfig = 'dokuwiki'; // default de DokuWiki
        }
    }

    $resultado['template_config'] = $templateConfig;

    // 2. Verificar que el template exista
    $tplPath = $subPath . '/lib/tpl/' . $templateConfig;
    $resultado['template_existe'] = is_dir($tplPath);

    if (!$resultado['template_existe']) {
        $resultado['estado'] = 'ERROR';
        $resultado['problemas'][] = [
            'tipo' => 'TEMPLATE_NO_EXISTE',
            'mensaje' => "El template '{$templateConfig}' no existe en lib/tpl/. La carpeta lib/tpl/{$templateConfig}/ no se encuentra.",
            'solucion' => "Copiar la carpeta del template '{$templateConfig}' al subdominio, o cambiar el template en conf/local.php.",
        ];

        // Verificar que templates existen
        $tplDir = $subPath . '/lib/tpl';
        if (is_dir($tplDir)) {
            $disponibles = [];
            $items = @scandir($tplDir);
            if ($items) {
                foreach ($items as $item) {
                    if ($item === '.' || $item === '..' || $item === 'index.php') continue;
                    if (is_dir($tplDir . '/' . $item)) {
                        $disponibles[] = $item;
                    }
                }
            }
            if (!empty($disponibles)) {
                $resultado['info'][] = "Templates disponibles: " . implode(', ', $disponibles);
            } else {
                $resultado['problemas'][] = [
                    'tipo' => 'SIN_TEMPLATES',
                    'mensaje' => 'No hay ningun template instalado en lib/tpl/.',
                    'solucion' => 'Copiar al menos el template 20cones o 21cones.',
                ];
            }
        } else {
            $resultado['problemas'][] = [
                'tipo' => 'SIN_DIRECTORIO_TPL',
                'mensaje' => 'El directorio lib/tpl/ no existe.',
                'solucion' => 'La estructura del sistema esta danada. Reinstalar.',
            ];
        }

        return $resultado;
    }

    // Template existe - verificar que no es un template valido SIE
    if (!in_array($templateConfig, $templatesValidos)) {
        $resultado['advertencias'][] = "Template '{$templateConfig}' no es uno de los templates SIE estandar (" . implode(', ', $templatesValidos) . ").";
    }

    // 3. Verificar archivos criticos
    foreach ($archivosCriticos as $archivo => $descripcion) {
        $fullPath = $tplPath . '/' . $archivo;
        if (!file_exists($fullPath)) {
            $resultado['archivos_faltantes'][] = $archivo;
            $resultado['problemas'][] = [
                'tipo' => 'ARCHIVO_FALTANTE',
                'mensaje' => "Falta archivo critico: {$archivo} ({$descripcion})",
                'solucion' => "Copiar {$archivo} del template original.",
            ];
        } elseif (!is_readable($fullPath)) {
            $resultado['problemas'][] = [
                'tipo' => 'PERMISO_LECTURA',
                'mensaje' => "Sin permiso de lectura: {$archivo}",
                'solucion' => "chmod 644 {$archivo}",
            ];
        } elseif (filesize($fullPath) === 0) {
            $resultado['problemas'][] = [
                'tipo' => 'ARCHIVO_VACIO',
                'mensaje' => "Archivo vacio: {$archivo} ({$descripcion})",
                'solucion' => "El archivo existe pero tiene 0 bytes. Reemplazar con el original.",
            ];
        }
    }

    // 4. Verificar directorios criticos
    foreach ($directoriosCriticos as $dir => $descripcion) {
        $fullPath = $tplPath . '/' . $dir;
        if (!is_dir($fullPath)) {
            $resultado['problemas'][] = [
                'tipo' => 'DIRECTORIO_FALTANTE',
                'mensaje' => "Falta directorio critico: {$dir}/ ({$descripcion})",
                'solucion' => "Copiar la carpeta {$dir}/ del template original.",
            ];
        }
    }

    // 5. Verificar style.ini - parsear y verificar CSS referenciados
    $styleIniPath = $tplPath . '/style.ini';
    if (file_exists($styleIniPath) && filesize($styleIniPath) > 0) {
        $ini = @parse_ini_file($styleIniPath, true);
        if ($ini === false) {
            $resultado['problemas'][] = [
                'tipo' => 'STYLE_INI_CORRUPTO',
                'mensaje' => 'style.ini no se puede parsear (sintaxis invalida).',
                'solucion' => 'Reemplazar style.ini con el original del template.',
            ];
        } else {
            // Verificar que los archivos CSS/LESS referenciados existan
            if (isset($ini['stylesheets']) && is_array($ini['stylesheets'])) {
                foreach ($ini['stylesheets'] as $cssFile => $media) {
                    $cssPath = $tplPath . '/' . $cssFile;
                    if (!file_exists($cssPath)) {
                        $resultado['css_faltantes'][] = $cssFile;
                    }
                }
                if (!empty($resultado['css_faltantes'])) {
                    $resultado['problemas'][] = [
                        'tipo' => 'CSS_FALTANTES',
                        'mensaje' => count($resultado['css_faltantes']) . " archivo(s) CSS/LESS referenciados en style.ini no existen: " . implode(', ', $resultado['css_faltantes']),
                        'solucion' => 'Copiar los archivos CSS/LESS faltantes del template original.',
                    ];
                }
            } else {
                $resultado['problemas'][] = [
                    'tipo' => 'STYLE_INI_SIN_CSS',
                    'mensaje' => 'style.ini no tiene seccion [stylesheets]. No se cargara ningun CSS.',
                    'solucion' => 'Verificar que style.ini tenga la seccion [stylesheets] con los archivos CSS.',
                ];
            }

            // Verificar que tenga [replacements]
            if (!isset($ini['replacements']) || empty($ini['replacements'])) {
                $resultado['advertencias'][] = 'style.ini no tiene seccion [replacements]. Los colores y variables del tema no estaran definidos.';
            }
        }
    }

    // 6. Verificar main.php tiene contenido minimo
    $mainPhp = $tplPath . '/main.php';
    if (file_exists($mainPhp)) {
        $mainContent = @file_get_contents($mainPhp);
        if ($mainContent !== false) {
            // Debe tener al menos tpl_content() o html_msgarea()
            if (strpos($mainContent, 'tpl_content') === false) {
                $resultado['advertencias'][] = 'main.php no contiene tpl_content(). El contenido de las paginas no se mostrara.';
            }
        }
    }

    // 7. Verificar cache de DokuWiki
    $cacheDir = $subPath . '/data/cache';
    if (is_dir($cacheDir)) {
        // Verificar si hay archivos .css en cache
        $cacheFiles = @glob($cacheDir . '/*.css');
        if ($cacheFiles === false || count($cacheFiles) === 0) {
            $resultado['info'][] = 'No hay archivos CSS en cache. Se regeneraran en el proximo acceso.';
        }

        // Verificar si cache tiene permisos de escritura
        if (!is_writable($cacheDir)) {
            $resultado['problemas'][] = [
                'tipo' => 'CACHE_NO_ESCRIBIBLE',
                'mensaje' => 'La carpeta data/cache/ no tiene permisos de escritura. DokuWiki no puede generar CSS.',
                'solucion' => 'chmod 777 data/cache/ o asignar propietario correcto.',
            ];
        }
    } else {
        $resultado['problemas'][] = [
            'tipo' => 'SIN_CACHE',
            'mensaje' => 'No existe la carpeta data/cache/. DokuWiki no puede cachear CSS compilados.',
            'solucion' => 'mkdir -p data/cache && chmod 777 data/cache',
        ];
    }

    // 8. Verificar conf/tpl/ (override de style.ini local)
    $confTplOverride = $subPath . '/conf/tpl/' . $templateConfig . '/style.ini';
    if (file_exists($confTplOverride)) {
        $iniOverride = @parse_ini_file($confTplOverride, true);
        if ($iniOverride === false) {
            $resultado['problemas'][] = [
                'tipo' => 'STYLE_OVERRIDE_CORRUPTO',
                'mensaje' => "conf/tpl/{$templateConfig}/style.ini (override) esta corrupto.",
                'solucion' => "Eliminar o corregir conf/tpl/{$templateConfig}/style.ini.",
            ];
        } else {
            $resultado['info'][] = "Tiene override de estilos en conf/tpl/{$templateConfig}/style.ini";
        }
    }

    // Determinar estado final
    if (!empty($resultado['problemas'])) {
        $resultado['estado'] = 'ERROR';
    } elseif (!empty($resultado['advertencias'])) {
        $resultado['estado'] = 'ADVERTENCIA';
    }

    return $resultado;
}

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

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

if ($modoScanAll) {
    $carpetas = @scandir($basePath);
    if (!$carpetas) {
        $msg = "ERROR: No se puede leer {$basePath}";
        echo $esCLI ? "{$msg}\n" : "<p style='color:red'>{$msg}</p>";
        exit(1);
    }

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

        $r = verificarTemplate($basePath . '/' . $carpeta, $carpeta, $templatesValidos, $archivosCriticos, $directoriosCriticos);
        $resultados[] = $r;
    }
} else {
    $subPath = $basePath . '/' . $targetSub;
    $r = verificarTemplate($subPath, $targetSub, $templatesValidos, $archivosCriticos, $directoriosCriticos);
    $resultados[] = $r;
}

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

// Estadisticas
$totalOK = 0;
$totalError = 0;
$totalAdv = 0;
$erroresPorTipo = [];

foreach ($resultados as $r) {
    if (!$r['tiene_doku']) continue;
    if ($r['estado'] === 'OK') $totalOK++;
    elseif ($r['estado'] === 'ERROR') $totalError++;
    elseif ($r['estado'] === 'ADVERTENCIA') $totalAdv++;

    foreach ($r['problemas'] as $p) {
        $tipo = $p['tipo'];
        if (!isset($erroresPorTipo[$tipo])) $erroresPorTipo[$tipo] = 0;
        $erroresPorTipo[$tipo]++;
    }
}

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

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

    echo "Resumen: OK={$totalOK} | Errores={$totalError} | Advertencias={$totalAdv}\n\n";

    if ($totalError > 0) {
        echo "=== SUBDOMINIOS CON ERRORES ===\n\n";
        foreach ($resultados as $r) {
            if ($r['estado'] !== 'ERROR') continue;
            echo "--- {$r['carpeta']} (template: {$r['template_config']}) ---\n";
            foreach ($r['problemas'] as $p) {
                echo "  [{$p['tipo']}] {$p['mensaje']}\n";
                if (isset($p['solucion'])) echo "    Fix: {$p['solucion']}\n";
            }
            echo "\n";
        }
    }

    if ($totalError === 0 && $totalAdv === 0) {
        echo "Todos los templates estan correctos.\n";
    }

} else {
    // === HTML ===
    ?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Verificador de Templates - 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; }
    .error-card { border-radius: 8px; padding: 14px; margin-bottom: 10px; border: 1px solid #fecaca; background: #fef2f2; }
    .error-card .sub-name { font-weight: 700; font-size: 1.05em; color: #0f172a; }
    .error-card .tpl-name { font-size: 0.85em; color: #64748b; margin-left: 8px; }
    .error-card .problem { margin-top: 8px; padding: 8px 10px; background: #fff; border-radius: 6px; border: 1px solid #fde2e2; font-size: 0.88em; }
    .error-card .problem .tipo { display: inline-block; padding: 1px 6px; border-radius: 4px; font-size: 0.75em; font-weight: 700; background: #fee2e2; color: #991b1b; margin-right: 4px; }
    .error-card .problem .msg { color: #334155; }
    .error-card .problem .sol { font-size: 0.82em; color: #475569; margin-top: 4px; background: #f8fafc; padding: 6px 8px; border-radius: 4px; }
    .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: none; border-radius: 6px; text-decoration: none; font-size: 0.9em; }
    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 { padding: 6px 10px; border: 1px solid #cbd5e1; border-radius: 6px; }
    .filter-bar input { padding: 6px 12px; border: 1px solid #cbd5e1; border-radius: 6px; width: 220px; }
</style>
</head>
<body>
<div class="container">
    <h1>&#127912; Verificador de Templates</h1>
    <p class="subtitle"><?= date('Y-m-d H:i:s') ?> | Tiempo: <?= $tiempoDiag ?>s | Base: <code><?= htmlspecialchars($basePath) ?></code></p>

    <!-- 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 escanear 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 <?= $totalError > 0 ? 'num-red' : 'num-green' ?>"><?= $totalError ?></div><div class="label">Con errores</div></div>
        <div class="summary-card"><div class="num <?= $totalAdv > 0 ? 'num-yellow' : 'num-green' ?>"><?= $totalAdv ?></div><div class="label">Advertencias</div></div>
    </div>

    <?php if ($totalError > 0): ?>
    <!-- ERRORES DETALLADOS -->
    <div class="section">
        <h2>&#9888;&#65039; Subdominios con errores de template (<?= $totalError ?>)</h2>
        <?php foreach ($resultados as $r): ?>
            <?php if ($r['estado'] !== 'ERROR') continue; ?>
            <div class="error-card">
                <span class="sub-name"><?= htmlspecialchars($r['carpeta']) ?></span>
                <span class="tpl-name">template: <code><?= htmlspecialchars($r['template_config']) ?></code>
                    <?php if (!$r['template_existe']): ?>
                        <span class="badge badge-err">NO EXISTE</span>
                    <?php endif; ?>
                </span>

                <?php foreach ($r['problemas'] as $p): ?>
                    <div class="problem">
                        <span class="tipo"><?= htmlspecialchars($p['tipo']) ?></span>
                        <span class="msg"><?= htmlspecialchars($p['mensaje']) ?></span>
                        <?php if (isset($p['solucion'])): ?>
                            <div class="sol">&#128295; <?= htmlspecialchars($p['solucion']) ?></div>
                        <?php endif; ?>
                    </div>
                <?php endforeach; ?>

                <?php if (!empty($r['info'])): ?>
                    <?php foreach ($r['info'] as $info): ?>
                        <div style="font-size:0.82em;color:#64748b;margin-top:4px;">&#8505; <?= htmlspecialchars($info) ?></div>
                    <?php endforeach; ?>
                <?php endif; ?>
            </div>
        <?php endforeach; ?>
    </div>

    <!-- Resumen por tipo de error -->
    <?php if (!empty($erroresPorTipo)): ?>
    <div class="section">
        <h2>&#128202; Resumen por tipo de error</h2>
        <table>
            <tr><th>Tipo de error</th><th>Cantidad</th></tr>
            <?php arsort($erroresPorTipo); foreach ($erroresPorTipo as $tipo => $cant): ?>
            <tr>
                <td><code><?= htmlspecialchars($tipo) ?></code></td>
                <td><strong><?= $cant ?></strong></td>
            </tr>
            <?php endforeach; ?>
        </table>
    </div>
    <?php endif; ?>
    <?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="ERROR">Solo errores</option>
                <option value="ADVERTENCIA">Solo advertencias</option>
                <option value="OK">Solo OK</option>
            </select>
        </div>
        <table id="tabla">
            <thead>
                <tr>
                    <th>#</th>
                    <th>Subdominio</th>
                    <th>Template</th>
                    <th>Existe</th>
                    <th>Estado</th>
                    <th>Problemas</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($resultados as $i => $r): ?>
                <?php if (!$r['tiene_doku']) continue; ?>
                <?php
                    $badgeClass = 'badge-ok';
                    $badgeText = 'OK';
                    if ($r['estado'] === 'ERROR') { $badgeClass = 'badge-err'; $badgeText = count($r['problemas']) . ' error(es)'; }
                    elseif ($r['estado'] === 'ADVERTENCIA') { $badgeClass = 'badge-warn'; $badgeText = count($r['advertencias']) . ' adv.'; }
                ?>
                <tr data-nombre="<?= htmlspecialchars(strtolower($r['carpeta'])) ?>" data-estado="<?= $r['estado'] ?>">
                    <td><?= $i + 1 ?></td>
                    <td><strong><?= htmlspecialchars($r['carpeta']) ?></strong></td>
                    <td><code><?= htmlspecialchars($r['template_config']) ?></code></td>
                    <td><?= $r['template_existe'] ? '&#9989;' : '&#10060;' ?></td>
                    <td><span class="badge <?= $badgeClass ?>"><?= $badgeText ?></span></td>
                    <td style="font-size:0.82em;">
                        <?php if (!empty($r['problemas'])): ?>
                            <?php foreach (array_slice($r['problemas'], 0, 2) as $p): ?>
                                <span style="color:#dc2626;"><?= htmlspecialchars($p['tipo']) ?></span><br>
                            <?php endforeach; ?>
                            <?php if (count($r['problemas']) > 2): ?>
                                <span style="color:#94a3b8;">+<?= count($r['problemas']) - 2 ?> mas</span>
                            <?php endif; ?>
                        <?php elseif (!empty($r['advertencias'])): ?>
                            <?php foreach ($r['advertencias'] as $adv): ?>
                                <span style="color:#d97706;"><?= htmlspecialchars(substr($adv, 0, 60)) ?>...</span><br>
                            <?php endforeach; ?>
                        <?php else: ?>
                            <span style="color:#94a3b8;">-</span>
                        <?php endif; ?>
                    </td>
                </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
    </div>
</div>

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