<?php
/**
 * MIGRADOR DE COMENTARIOS DISCUSSION - SUBDOMINIOS SIE
 * =====================================================
 * Migra comentarios del plugin Discussion desde paginas origen a paginas destino.
 * Los comentarios se almacenan en data/meta/<page_path>.comments (PHP serializado).
 *
 * MAPEOS CONFIGURADOS:
 *   varios:menu:1  -->  es:bez:admin_thread:id:1
 *   varios:menu:2  -->  proyectos:administrativos:1:2_requisitos_eticos
 *   varios:menu:3  -->  proyectos:administrativos:1:3_recursos_humanos
 *
 * MODOS:
 *   ?modo=escanear   (default) - Solo detectar, no modificar nada
 *   ?modo=corregir              - Migrar comentarios en TODOS los afectados
 *   ?sub=nombre                 - Verificar/corregir uno solo
 *
 * LOGICA DE MERGE:
 *   Si el destino ya tiene comentarios, se fusionan (merge).
 *   Si hay colision de cid, se conserva el mas reciente.
 *   El campo 'number' se recalcula despues del merge.
 *   Se crea backup del destino antes de modificar.
 */

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

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

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

// Mapeos de migracion: origen => destino (page IDs con colons)
$mapeos = [
    'varios:menu:1' => 'proyectos:administrativos:1:1_responsabilidades',
    'varios:menu:2' => 'proyectos:administrativos:1:2_requisitos_eticos',
    'varios:menu:3' => 'proyectos:administrativos:1:3_recursos_humanos',
];

// =====================================================================
//  PARAMETROS
// =====================================================================

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

if (!$esCLI) {
    header('Content-Type: text/html; charset=UTF-8');
}

$modo      = $esCLI ? ($argv[1] ?? 'escanear') : ($_GET['modo'] ?? 'escanear');
$targetSub = $esCLI ? ($argv[2] ?? '')          : ($_GET['sub'] ?? '');

if (!empty($targetSub)) {
    if (preg_match('#^https?://#i', $targetSub)) {
        $parsed = parse_url($targetSub);
        if (isset($parsed['host'])) {
            $parts = explode('.', $parsed['host']);
            $targetSub = $parts[0];
        }
    }
    $targetSub = basename(preg_replace('/[^a-zA-Z0-9._-]/', '', $targetSub));
}

// =====================================================================
//  FUNCIONES AUXILIARES
// =====================================================================

/**
 * Convierte page ID (colons) a ruta de archivo .comments
 * Ej: 'varios:menu:1' -> 'data/meta/varios/menu/1.comments'
 */
function pageIdToCommentsPath($subPath, $pageId)
{
    $parts = explode(':', $pageId);
    return $subPath . '/data/meta/' . implode('/', $parts) . '.comments';
}

/**
 * Lee y deserializa un archivo .comments
 * Retorna array con la estructura o null si no existe/falla
 */
function leerComentarios($filePath)
{
    if (!file_exists($filePath)) return null;

    $content = @file_get_contents($filePath);
    if ($content === false || empty(trim($content))) return null;

    $data = @unserialize($content, ['allowed_classes' => false]);
    if ($data === false) return null;

    return $data;
}

/**
 * Cuenta comentarios visibles en una estructura de datos
 */
function contarVisibles($data)
{
    if (empty($data['comments'])) return 0;
    $count = 0;
    foreach ($data['comments'] as $c) {
        if (!empty($c['show'])) $count++;
    }
    return $count;
}

/**
 * Cuenta total de comentarios (visibles + ocultos)
 */
function contarTotal($data)
{
    if (empty($data['comments'])) return 0;
    return count($data['comments']);
}

/**
 * Genera una huella unica del contenido de un comentario
 * para detectar duplicados aunque tengan diferente cid
 */
function huellaComentario($comment)
{
    $raw  = trim($comment['raw'] ?? '');
    $user = $comment['user']['id'] ?? $comment['user']['name'] ?? '';
    // Huella = contenido + usuario (sin timestamp, para detectar mismo texto)
    return md5($raw . '|' . $user);
}

/**
 * Fusiona dos estructuras de comentarios
 * - Si hay colision de cid, conserva el mas reciente
 * - Si hay comentario con mismo contenido+usuario (diferente cid), lo salta (NO duplica)
 */
function fusionarComentarios($destData, $srcData)
{
    // Inicializar resultado desde destino existente
    $result = $destData;

    // Si destino no tiene estructura valida, crear desde cero
    if (!is_array($result)) {
        $result = [
            'status'      => 1,
            'number'      => 0,
            'comments'    => [],
            'subscribers' => [],
        ];
    }
    if (!isset($result['comments']))    $result['comments'] = [];
    if (!isset($result['subscribers'])) $result['subscribers'] = [];

    // Status: tomar el mas permisivo (1=open es mejor que 0=disabled)
    $result['status'] = max($result['status'] ?? 0, $srcData['status'] ?? 0);

    // Construir indice de huellas de los comentarios YA existentes en destino
    $huellasDestino = [];
    foreach ($result['comments'] as $existCid => $existComment) {
        $huellasDestino[huellaComentario($existComment)] = $existCid;
    }

    // Fusionar comentarios
    $agregados = 0;
    $colisiones = 0;
    $duplicados = 0;
    if (!empty($srcData['comments'])) {
        foreach ($srcData['comments'] as $cid => $comment) {
            // CHECK 1: Colision directa de cid
            if (isset($result['comments'][$cid])) {
                $existente = $result['comments'][$cid]['date']['created'] ?? 0;
                $nuevo     = $comment['date']['created'] ?? 0;
                if ($nuevo > $existente) {
                    $result['comments'][$cid] = $comment;
                }
                $colisiones++;
                continue;
            }

            // CHECK 2: Mismo contenido+usuario con diferente cid (duplicado real)
            $huella = huellaComentario($comment);
            if (isset($huellasDestino[$huella])) {
                $duplicados++;
                continue; // NO agregar, ya existe con otro cid
            }

            // No existe: agregar
            $result['comments'][$cid] = $comment;
            $huellasDestino[$huella] = $cid; // Registrar para evitar duplicados internos
            $agregados++;
        }
    }

    // Fusionar subscribers
    if (!empty($srcData['subscribers'])) {
        foreach ($srcData['subscribers'] as $email => $info) {
            if (!isset($result['subscribers'][$email])) {
                $result['subscribers'][$email] = $info;
            } else {
                // Preferir active=true
                if (!empty($info['active'])) {
                    $result['subscribers'][$email]['active'] = true;
                }
            }
        }
    }

    // Recalcular number
    $result['number'] = contarVisibles($result);

    // Conservar title del destino si existe, sino del origen
    if (empty($result['title']) && !empty($srcData['title'])) {
        $result['title'] = $srcData['title'];
    }

    return [
        'data'       => $result,
        'agregados'  => $agregados,
        'colisiones' => $colisiones,
        'duplicados' => $duplicados,
    ];
}

// =====================================================================
//  FUNCIONES DE ANALISIS Y CORRECCION
// =====================================================================

/**
 * Analiza un subdominio: verifica que mapeos tienen comentarios en origen
 */
function analizarSubdominio($subPath, $carpeta, $mapeos)
{
    $r = [
        'carpeta'    => $carpeta,
        'tiene_doku' => false,
        'mapeos'     => [],
        'total_src'  => 0,
        'total_dst'  => 0,
        'pendientes' => 0,
        'estado'     => 'NO_DOKU',
    ];

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

    foreach ($mapeos as $srcId => $dstId) {
        $srcPath = pageIdToCommentsPath($subPath, $srcId);
        $dstPath = pageIdToCommentsPath($subPath, $dstId);

        $srcData = leerComentarios($srcPath);
        $dstData = leerComentarios($dstPath);

        $srcCount = $srcData ? contarTotal($srcData) : 0;
        $dstCount = $dstData ? contarTotal($dstData) : 0;

        $m = [
            'src_id'     => $srcId,
            'dst_id'     => $dstId,
            'src_existe' => file_exists($srcPath),
            'dst_existe' => file_exists($dstPath),
            'src_count'  => $srcCount,
            'dst_count'  => $dstCount,
            'estado'     => 'SIN_ORIGEN', // default
        ];

        if ($srcCount > 0 && $dstCount === 0) {
            $m['estado'] = 'PENDIENTE';
            $r['pendientes']++;
        } elseif ($srcCount > 0 && $dstCount > 0) {
            // Verificar si ya fueron migrados
            // CHECK 1: por cid directo
            $srcCids = array_keys($srcData['comments'] ?? []);
            $dstCids = array_keys($dstData['comments'] ?? []);
            $faltantesCid = array_diff($srcCids, $dstCids);

            // CHECK 2: por contenido (mismo texto+usuario con diferente cid)
            $huellasDst = [];
            foreach ($dstData['comments'] as $dc) {
                $huellasDst[huellaComentario($dc)] = true;
            }
            $faltantesReales = 0;
            foreach ($faltantesCid as $fCid) {
                $h = huellaComentario($srcData['comments'][$fCid]);
                if (!isset($huellasDst[$h])) {
                    $faltantesReales++;
                }
            }

            if (empty($faltantesCid) || $faltantesReales === 0) {
                $m['estado'] = 'YA_MIGRADO';
            } else {
                $m['estado'] = 'MERGE_PENDIENTE';
                $m['faltantes'] = $faltantesReales;
                $r['pendientes']++;
            }
        } elseif ($srcCount === 0 && $dstCount > 0) {
            $m['estado'] = 'SOLO_DESTINO';
        } elseif ($srcCount === 0 && $dstCount === 0) {
            $m['estado'] = 'SIN_COMENTARIOS';
        }

        $r['total_src'] += $srcCount;
        $r['total_dst'] += $dstCount;
        $r['mapeos'][] = $m;
    }

    $r['estado'] = $r['pendientes'] > 0 ? 'PENDIENTE' : 'OK';
    return $r;
}

/**
 * Corrige un subdominio: migra comentarios de origen a destino
 */
function corregirSubdominio($subPath, $carpeta, $mapeos)
{
    $resultados = [];
    $timestamp = date('Ymd_His');

    foreach ($mapeos as $srcId => $dstId) {
        $srcPath = pageIdToCommentsPath($subPath, $srcId);
        $dstPath = pageIdToCommentsPath($subPath, $dstId);

        $srcData = leerComentarios($srcPath);
        if (!$srcData || empty($srcData['comments'])) {
            $resultados[] = [
                'mapeo' => "{$srcId} -> {$dstId}",
                'ok'    => true,
                'msg'   => 'Sin comentarios en origen, nada que migrar',
                'count' => 0,
            ];
            continue;
        }

        // Verificar si ya migrado
        $dstData = leerComentarios($dstPath);
        if ($dstData) {
            $srcCids = array_keys($srcData['comments'] ?? []);
            $dstCids = array_keys($dstData['comments'] ?? []);
            $faltantes = array_diff($srcCids, $dstCids);
            if (empty($faltantes)) {
                $resultados[] = [
                    'mapeo' => "{$srcId} -> {$dstId}",
                    'ok'    => true,
                    'msg'   => 'Ya migrado, todos los comentarios existen en destino',
                    'count' => 0,
                ];
                continue;
            }
        }

        // Crear directorio destino si no existe
        $dstDir = dirname($dstPath);
        if (!is_dir($dstDir)) {
            if (!@mkdir($dstDir, 0755, true)) {
                $resultados[] = [
                    'mapeo' => "{$srcId} -> {$dstId}",
                    'ok'    => false,
                    'msg'   => "No se pudo crear directorio: {$dstDir}",
                    'count' => 0,
                ];
                continue;
            }
        }

        // Backup del destino si existe
        $backupMsg = '';
        if (file_exists($dstPath)) {
            $backupName = basename($dstPath) . ".bak_migcom_{$timestamp}";
            $backupPath = $dstDir . '/' . $backupName;
            if (@copy($dstPath, $backupPath)) {
                $backupMsg = " Backup: {$backupName}";
            }
        }

        // Fusionar
        $merge = fusionarComentarios($dstData, $srcData);
        $nuevoData = $merge['data'];

        // Escribir resultado
        $serialized = serialize($nuevoData);
        if (@file_put_contents($dstPath, $serialized) === false) {
            $resultados[] = [
                'mapeo' => "{$srcId} -> {$dstId}",
                'ok'    => false,
                'msg'   => "No se pudo escribir en destino.{$backupMsg}",
                'count' => 0,
            ];
            continue;
        }

        $totalFinal = contarTotal($nuevoData);
        $resultados[] = [
            'mapeo' => "{$srcId} -> {$dstId}",
            'ok'    => true,
            'msg'   => "Migrados {$merge['agregados']} comentarios" .
                       ($merge['colisiones'] > 0 ? ", {$merge['colisiones']} colisiones resueltas" : '') .
                       ($merge['duplicados'] > 0 ? ", {$merge['duplicados']} duplicados saltados" : '') .
                       ". Total en destino: {$totalFinal}.{$backupMsg}",
            'count' => $merge['agregados'],
        ];
    }

    return $resultados;
}

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

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

// Obtener lista de carpetas
if (!empty($targetSub)) {
    $carpetas = [$targetSub];
} else {
    $carpetas = [];
    $scan = @scandir($basePath);
    if (!$scan) {
        echo $esCLI ? "ERROR: No se puede leer {$basePath}\n" : "<p style='color:red'>ERROR: No se puede leer {$basePath}</p>";
        exit(1);
    }
    foreach ($scan as $c) {
        if (in_array($c, $excluir)) continue;
        if (!is_dir($basePath . '/' . $c)) continue;
        $carpetas[] = $c;
    }
    sort($carpetas);
}

// Escanear
foreach ($carpetas as $carpeta) {
    $subPath = $basePath . '/' . $carpeta;
    $r = analizarSubdominio($subPath, $carpeta, $mapeos);
    if (!$r['tiene_doku']) continue;
    $resultados[] = $r;

    // Corregir si esta en modo corregir y tiene pendientes
    if ($modo === 'corregir' && $r['estado'] === 'PENDIENTE') {
        $fix = corregirSubdominio($subPath, $carpeta, $mapeos);
        $correcciones[$carpeta] = $fix;
    }
}

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

// Estadisticas
$totalOK       = count(array_filter($resultados, fn($r) => $r['estado'] === 'OK'));
$totalPendiente = count(array_filter($resultados, fn($r) => $r['estado'] === 'PENDIENTE'));
$totalComentariosSrc = array_sum(array_column($resultados, 'total_src'));

// Conteo por estado de mapeo
$conteoEstados = [];
foreach ($resultados as $r) {
    foreach ($r['mapeos'] as $m) {
        if (!isset($conteoEstados[$m['estado']])) $conteoEstados[$m['estado']] = 0;
        $conteoEstados[$m['estado']]++;
    }
}

// =====================================================================
//  SALIDA CLI
// =====================================================================

if ($esCLI) {
    echo "================================================================\n";
    echo " MIGRADOR DE COMENTARIOS DISCUSSION - SIE\n";
    echo " " . date('Y-m-d H:i:s') . " | Modo: {$modo} | Tiempo: {$tiempoFin}s\n";
    echo "================================================================\n\n";

    echo "Sistemas: " . count($resultados) . " | OK: {$totalOK} | Pendientes: {$totalPendiente}\n";
    echo "Comentarios en origen: {$totalComentariosSrc}\n\n";

    if (!empty($conteoEstados)) {
        echo "Estados de mapeos:\n";
        foreach ($conteoEstados as $est => $cnt) {
            echo "  {$est}: {$cnt}\n";
        }
        echo "\n";
    }

    $afectados = array_filter($resultados, fn($r) => $r['estado'] === 'PENDIENTE');
    if (!empty($afectados)) {
        echo "=== SISTEMAS CON MIGRACIONES PENDIENTES ===\n";
        foreach ($afectados as $r) {
            echo "  {$r['carpeta']} ({$r['total_src']} comentarios en origen)\n";
            foreach ($r['mapeos'] as $m) {
                if (in_array($m['estado'], ['PENDIENTE', 'MERGE_PENDIENTE'])) {
                    echo "    {$m['src_id']} ({$m['src_count']}) -> {$m['dst_id']} ({$m['dst_count']})\n";
                }
            }
            if (isset($correcciones[$r['carpeta']])) {
                foreach ($correcciones[$r['carpeta']] as $fix) {
                    echo "    " . ($fix['ok'] ? 'OK' : 'ERROR') . ": {$fix['msg']}\n";
                }
            }
        }
    }
    exit(0);
}

// =====================================================================
//  SALIDA HTML
// =====================================================================
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Migrador Comentarios Discussion - 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: 1400px; margin: 0 auto; }
    h1 { font-size: 1.5em; color: #0f172a; margin-bottom: 4px; }
    .subtitle { color: #64748b; font-size: 0.88em; margin-bottom: 20px; }

    .summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 12px; margin-bottom: 20px; }
    .card { background: #fff; border-radius: 10px; padding: 14px; text-align: center; box-shadow: 0 1px 3px rgba(0,0,0,0.08); }
    .card .num { font-size: 1.8em; font-weight: 700; }
    .card .label { font-size: 0.8em; color: #64748b; }
    .green { color: #16a34a; } .red { color: #dc2626; } .yellow { color: #d97706; } .blue { color: #2563eb; } .purple { color: #7c3aed; }

    .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.1em; margin-bottom: 12px; }

    .explain { background: #eff6ff; border: 1px solid #93c5fd; border-radius: 10px; padding: 16px; margin-bottom: 20px; }
    .explain h2 { color: #1e40af; margin-bottom: 8px; font-size: 1em; }
    .explain p { font-size: 0.86em; color: #334155; margin-bottom: 4px; }
    .explain code { background: #dbeafe; color: #1e40af; padding: 1px 4px; border-radius: 3px; font-size: 0.9em; }

    .mapeo-box { background: #f8fafc; border: 1px solid #e2e8f0; border-radius: 8px; padding: 10px 14px; margin-bottom: 8px; font-size: 0.86em; }
    .mapeo-box code { font-size: 0.92em; }
    .mapeo-arrow { color: #2563eb; font-weight: 700; margin: 0 6px; }

    .actions { display: flex; gap: 12px; margin-bottom: 20px; flex-wrap: wrap; align-items: center; }
    .btn { padding: 10px 20px; border: none; border-radius: 8px; font-size: 0.9em; cursor: pointer; text-decoration: none; display: inline-block; font-weight: 600; }
    .btn-blue { background: #2563eb; color: #fff; } .btn-blue:hover { background: #1d4ed8; }
    .btn-red { background: #dc2626; color: #fff; } .btn-red:hover { background: #b91c1c; }
    .btn-green { background: #16a34a; color: #fff; } .btn-gray { background: #64748b; color: #fff; }

    .result-box { border-radius: 10px; padding: 16px; margin-bottom: 20px; }
    .result-ok { background: #f0fdf4; border: 1px solid #86efac; }
    .result-ok strong { color: #166534; }
    .result-err { background: #fef2f2; border: 1px solid #fecaca; }

    .problema-grupo { margin-bottom: 14px; padding: 12px 14px; border-radius: 8px; }
    .pg-pendiente { background: #fef3c7; border: 1px solid #fde68a; }
    .pg-merge { background: #ede9fe; border: 1px solid #c4b5fd; }
    .pg-title { font-weight: 700; font-size: 0.92em; margin-bottom: 6px; }
    .pg-lista { font-size: 0.85em; line-height: 1.9; }

    table { width: 100%; border-collapse: collapse; font-size: 0.83em; }
    th { text-align: left; padding: 8px 6px; border-bottom: 2px solid #e2e8f0; color: #475569; font-size: 0.85em; }
    td { padding: 7px 6px; border-bottom: 1px solid #f1f5f9; }
    tr:hover { background: #f8fafc; }
    tr.row-err { background: #fef2f2; }
    tr.row-err:hover { background: #fee2e2; }
    tr.row-pend { background: #fffbeb; }
    tr.row-pend:hover { background: #fef3c7; }

    .badge { display: inline-block; padding: 2px 7px; border-radius: 4px; font-size: 0.76em; font-weight: 600; }
    .badge-ok { background: #dcfce7; color: #166534; }
    .badge-err { background: #fee2e2; color: #991b1b; }
    .badge-fix { background: #dbeafe; color: #1e40af; }
    .badge-warn { background: #fef3c7; color: #92400e; }
    .badge-pend { background: #ede9fe; color: #5b21b6; }
    .badge-gray { background: #f1f5f9; color: #64748b; }

    .filter-bar { margin-bottom: 12px; display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
    .filter-bar input, .filter-bar select { padding: 6px 10px; border: 1px solid #cbd5e1; border-radius: 6px; font-size: 0.86em; }
    .filter-bar input { width: 200px; }

    .sub-table { width: 100%; font-size: 0.82em; margin-top: 6px; }
    .sub-table td { padding: 3px 6px; border: none; }
</style>
</head>
<body>
<div class="container">

<h1>&#128172; Migrador de Comentarios Discussion - SIE</h1>
<p class="subtitle">
    <?= date('Y-m-d H:i:s') ?> |
    Modo: <strong><?= $modo === 'corregir' ? '&#9888;&#65039; MIGRAR' : '&#128269; ESCANEAR' ?></strong> |
    Tiempo: <?= $tiempoFin ?>s |
    Sistemas: <?= count($resultados) ?>
</p>

<div class="explain">
    <h2>&#128161; Que hace este script</h2>
    <p><strong>Proposito:</strong> Migra los comentarios del plugin Discussion desde paginas antiguas a paginas nuevas.</p>
    <p><strong>Mapeos configurados:</strong></p>
    <?php foreach ($mapeos as $src => $dst): ?>
    <div class="mapeo-box">
        <code><?= htmlspecialchars($src) ?></code>
        <span class="mapeo-arrow">&rarr;</span>
        <code><?= htmlspecialchars($dst) ?></code>
    </div>
    <?php endforeach; ?>
    <p style="margin-top:8px;"><strong>Merge:</strong> Si el destino ya tiene comentarios, se fusionan sin perder ninguno. Se crea backup antes de modificar.</p>
</div>

<!-- Resumen -->
<div class="summary">
    <div class="card"><div class="num blue"><?= count($resultados) ?></div><div class="label">Total DokuWiki</div></div>
    <div class="card"><div class="num green"><?= $totalOK ?></div><div class="label">Sin pendientes</div></div>
    <div class="card"><div class="num <?= $totalPendiente > 0 ? 'yellow' : 'green' ?>"><?= $totalPendiente ?></div><div class="label">Con migracion pendiente</div></div>
    <div class="card"><div class="num purple"><?= $totalComentariosSrc ?></div><div class="label">Comentarios en origen (total)</div></div>
    <?php foreach ($conteoEstados as $est => $cnt): ?>
    <div class="card"><div class="num" style="font-size:1.4em;"><?= $cnt ?></div><div class="label"><?= htmlspecialchars($est) ?></div></div>
    <?php endforeach; ?>
</div>

<!-- Botones -->
<div class="actions">
    <a href="?modo=escanear" class="btn btn-blue">&#128269; Escanear todos</a>
    <?php if ($totalPendiente > 0 && $modo !== 'corregir'): ?>
        <a href="?modo=corregir" class="btn btn-red"
           onclick="return confirm('ATENCION: Esto va a migrar comentarios en <?= $totalPendiente ?> sistemas.\n\nSe creara backup del destino antes de modificar.\nSi el destino ya tiene comentarios, se fusionan (merge).\n\nContinuar?')">
            &#128172; Migrar en <?= $totalPendiente ?> sistemas
        </a>
    <?php endif; ?>
    <?php if (!empty($targetSub)): ?>
        <a href="?" class="btn btn-gray">Ver todos</a>
    <?php endif; ?>
</div>

<?php if ($modo === 'corregir' && !empty($correcciones)): ?>
<!-- Resultado de migraciones -->
<?php
$totalFixOK = 0; $totalFixErr = 0; $totalMigrados = 0;
foreach ($correcciones as $fixes) {
    foreach ($fixes as $f) {
        if ($f['ok']) { $totalFixOK++; $totalMigrados += $f['count']; }
        else { $totalFixErr++; }
    }
}
?>
<div class="result-box <?= $totalFixErr > 0 ? 'result-err' : 'result-ok' ?>">
    <strong>&#9989; Resultado: <?= $totalFixOK ?> mapeos migrados, <?= $totalFixErr ?> errores, <?= $totalMigrados ?> comentarios movidos</strong>
    <table style="margin-top:10px;">
        <thead><tr><th>Subdominio</th><th>Mapeo</th><th>Resultado</th><th>Detalle</th></tr></thead>
        <tbody>
        <?php foreach ($correcciones as $carpeta => $fixes): ?>
            <?php foreach ($fixes as $f): ?>
            <tr>
                <td><strong><?= htmlspecialchars($carpeta) ?></strong></td>
                <td><code style="font-size:0.85em;"><?= htmlspecialchars($f['mapeo']) ?></code></td>
                <td><span class="badge <?= $f['ok'] ? 'badge-ok' : 'badge-err' ?>"><?= $f['ok'] ? ($f['count'] > 0 ? 'MIGRADO' : 'SIN CAMBIOS') : 'ERROR' ?></span></td>
                <td style="font-size:0.85em;"><?= htmlspecialchars($f['msg']) ?></td>
            </tr>
            <?php endforeach; ?>
        <?php endforeach; ?>
        </tbody>
    </table>
</div>
<?php endif; ?>

<?php
$afectadosPend = array_filter($resultados, fn($r) => $r['estado'] === 'PENDIENTE');
if (!empty($afectadosPend) && $modo !== 'corregir'): ?>
<!-- Sistemas pendientes -->
<div class="section">
    <h2>&#9888;&#65039; Sistemas con migracion pendiente (<?= count($afectadosPend) ?>)</h2>
    <?php foreach ($afectadosPend as $r): ?>
    <div class="problema-grupo pg-pendiente">
        <div class="pg-title"><?= htmlspecialchars($r['carpeta']) ?> &mdash; <?= $r['total_src'] ?> comentarios en origen</div>
        <table class="sub-table">
        <?php foreach ($r['mapeos'] as $m): ?>
            <?php if (in_array($m['estado'], ['PENDIENTE', 'MERGE_PENDIENTE'])): ?>
            <tr>
                <td><code><?= htmlspecialchars($m['src_id']) ?></code> (<?= $m['src_count'] ?>)</td>
                <td>&rarr;</td>
                <td><code><?= htmlspecialchars($m['dst_id']) ?></code> (<?= $m['dst_count'] ?>)</td>
                <td>
                    <?php if ($m['estado'] === 'MERGE_PENDIENTE'): ?>
                        <span class="badge badge-pend">MERGE (<?= $m['faltantes'] ?> faltan)</span>
                    <?php else: ?>
                        <span class="badge badge-warn">PENDIENTE</span>
                    <?php endif; ?>
                </td>
            </tr>
            <?php endif; ?>
        <?php endforeach; ?>
        </table>
    </div>
    <?php endforeach; ?>
</div>
<?php endif; ?>

<!-- Tabla completa -->
<div class="section">
    <h2>&#128203; Todos los sistemas (<?= count($resultados) ?>)</h2>
    <div class="filter-bar">
        <input type="text" id="filtro" placeholder="Buscar..." oninput="filtrar()">
        <select id="filtroEstado" onchange="filtrar()">
            <option value="">Todos</option>
            <option value="pend">Con pendientes</option>
            <option value="OK">Solo OK</option>
        </select>
    </div>
    <table id="tabla">
        <thead>
            <tr>
                <th>#</th>
                <th>Subdominio</th>
                <th>Estado</th>
                <th>Origen total</th>
                <th>Destino total</th>
                <th>Detalle mapeos</th>
            </tr>
        </thead>
        <tbody>
        <?php $i = 0; foreach ($resultados as $r): $i++; ?>
            <?php $rowClass = $r['estado'] === 'PENDIENTE' ? 'row-pend' : ''; ?>
            <tr class="<?= $rowClass ?>" data-name="<?= htmlspecialchars(strtolower($r['carpeta'])) ?>" data-estado="<?= $r['estado'] === 'OK' ? 'OK' : 'pend' ?>">
                <td><?= $i ?></td>
                <td><strong><?= htmlspecialchars($r['carpeta']) ?></strong></td>
                <td>
                    <?php if ($r['estado'] === 'OK'): ?>
                        <span class="badge badge-ok">OK</span>
                    <?php else: ?>
                        <span class="badge badge-warn">PENDIENTE (<?= $r['pendientes'] ?>)</span>
                    <?php endif; ?>
                </td>
                <td><?= $r['total_src'] ?></td>
                <td><?= $r['total_dst'] ?></td>
                <td>
                    <?php foreach ($r['mapeos'] as $m): ?>
                        <?php
                        $badgeClass = 'badge-gray';
                        $label = $m['estado'];
                        switch ($m['estado']) {
                            case 'PENDIENTE': $badgeClass = 'badge-warn'; break;
                            case 'MERGE_PENDIENTE': $badgeClass = 'badge-pend'; $label = "MERGE({$m['faltantes']})"; break;
                            case 'YA_MIGRADO': $badgeClass = 'badge-ok'; $label = 'MIGRADO'; break;
                            case 'SOLO_DESTINO': $badgeClass = 'badge-ok'; break;
                            case 'SIN_COMENTARIOS': $badgeClass = 'badge-gray'; $label = 'VACIO'; break;
                            case 'SIN_ORIGEN': $badgeClass = 'badge-gray'; break;
                        }
                        ?>
                        <span class="badge <?= $badgeClass ?>" title="<?= htmlspecialchars($m['src_id']) ?> -> <?= htmlspecialchars($m['dst_id']) ?>"><?= $label ?></span>
                    <?php endforeach; ?>
                </td>
            </tr>
        <?php endforeach; ?>
        </tbody>
    </table>
</div>

</div><!-- /container -->

<script>
function filtrar() {
    var texto = document.getElementById('filtro').value.toLowerCase();
    var estado = document.getElementById('filtroEstado').value;
    var rows = document.querySelectorAll('#tabla tbody tr');
    rows.forEach(function(row) {
        var name = row.dataset.name || '';
        var est = row.dataset.estado || '';
        var showText = !texto || name.indexOf(texto) !== -1;
        var showEstado = !estado || est === estado;
        row.style.display = (showText && showEstado) ? '' : 'none';
    });
}
</script>
</body>
</html>
