<?php
/**
 * Template: Vista de Proyecto Administrativo
 *
 * Similar a thread_box.php pero para proyectos administrativos
 *
 * @var \dokuwiki\plugin\bez\meta\Tpl $tpl
 */

$proyecto = $tpl->get('proyecto');
$secciones = $tpl->get('secciones');
$puedeEditar = $tpl->get('puedeEditar');
$puedeRecalcular = $tpl->get('puedeRecalcular');
$puedeFinalizar = $tpl->get('puedeFinalizar');
$tareas = $tpl->get('tareas') ?: [];
$comentarios = $tpl->get('comentarios') ?: [];
$participantes = $tpl->get('participantes') ?: [];
$isAdminThreadGod = $tpl->get('isAdminThreadGod') ?: false;
$allUsers = $tpl->get('allUsers') ?: [];
$esParticipante = $tpl->get('esParticipante') ?: false;
$seccionesMap = $tpl->get('seccionesMap') ?: [];
$currentUser = $tpl->get('currentUser') ?: '';
$userNamesMap = $tpl->get('userNamesMap') ?: [];
?>

<style>
    .admin-thread-container {
        max-width: 1000px;
        margin: 0 auto;
        padding: 20px;
    }

    .admin-thread-header {
        background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
        color: white;
        padding: 25px;
        border-radius: 12px;
        margin-bottom: 25px;
        box-shadow: 0 4px 15px rgba(102, 126, 234, 0.4);
    }

    .admin-thread-header h1 {
        margin: 0 0 10px 0;
        font-size: 1.8em;
    }

    .admin-thread-header .meta {
        display: flex;
        gap: 20px;
        flex-wrap: wrap;
        font-size: 0.95em;
        opacity: 0.9;
    }

    .admin-thread-header .meta span {
        display: flex;
        align-items: center;
        gap: 5px;
    }

    .info-card {
        background: white;
        border-radius: 10px;
        padding: 20px;
        margin-bottom: 20px;
        box-shadow: 0 2px 8px rgba(0,0,0,0.08);
    }

    .info-card h3 {
        margin: 0 0 15px 0;
        color: #333;
        border-bottom: 2px solid #667eea;
        padding-bottom: 10px;
    }

    .info-grid {
        display: grid;
        grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
        gap: 15px;
    }

    .info-item {
        padding: 10px;
        background: #f8f9fa;
        border-radius: 6px;
    }

    .info-item label {
        display: block;
        font-size: 0.8em;
        color: #666;
        margin-bottom: 4px;
        text-transform: uppercase;
    }

    .info-item span {
        font-weight: 600;
        color: #333;
    }

    .estado-badge {
        display: inline-block;
        padding: 4px 12px;
        border-radius: 20px;
        font-size: 0.85em;
        font-weight: 500;
    }

    .estado-opened {
        background: #e8f5e9;
        color: #2e7d32;
    }

    .estado-closed {
        background: #ffebee;
        color: #c62828;
    }

    .estado-compilado {
        background: #fff3e0;
        color: #e65100;
    }

    /* Tabla de progreso */
    .progress-table-container {
        background: white;
        border-radius: 10px;
        overflow: hidden;
        box-shadow: 0 2px 8px rgba(0,0,0,0.08);
        margin-bottom: 20px;
    }

    .progress-table {
        width: 100%;
        border-collapse: collapse;
    }

    .progress-table thead {
        background: #1e3a5f !important;
        color: #ffffff !important;
    }

    .progress-table th {
        padding: 15px;
        text-align: center;
        font-weight: 600;
        color: #ffffff !important;
        background: #1e3a5f !important;
    }

    .progress-table td {
        padding: 15px;
        text-align: center;
        border-bottom: 1px solid #eee;
        vertical-align: middle;
    }

    .progress-table tbody tr:hover {
        background: #f9f9f9;
    }

    .progress-table .seccion-nombre {
        text-align: left;
        font-weight: 500;
    }

    .progress-table .seccion-nombre a {
        color: #333;
        text-decoration: none;
    }

    .progress-table .seccion-nombre a:hover {
        color: #667eea;
    }

    .progress-bar-container {
        width: 100%;
        height: 22px;
        background: #e0e0e0;
        border-radius: 11px;
        overflow: hidden;
        position: relative;
    }

    .progress-bar {
        height: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
        color: white;
        font-weight: bold;
        font-size: 11px;
        transition: width 0.3s ease;
    }

    .progress-red { background: #f44336; }
    .progress-orange { background: #ff9800; }
    .progress-blue { background: #2196f3; }
    .progress-green { background: #4caf50; }

    .seccion-no-progreso {
        background: #fff3e0;
        color: #e65100;
        padding: 3px 10px;
        border-radius: 12px;
        font-size: 0.8em;
    }

    /* Progreso total */
    .progreso-total {
        background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
        padding: 25px;
        border-radius: 10px;
        text-align: center;
        margin-bottom: 20px;
    }

    .progreso-total h3 {
        margin: 0 0 15px 0;
        color: #333;
    }

    .progreso-total .porcentaje-grande {
        font-size: 3em;
        font-weight: bold;
        color: #667eea;
    }

    .progreso-total .detalle {
        color: #666;
        margin-top: 10px;
    }

    /* Botones de acción */
    .acciones-container {
        display: flex;
        gap: 10px;
        flex-wrap: wrap;
        margin-top: 20px;
    }

    .btn-accion {
        padding: 10px 20px;
        border: none;
        border-radius: 6px;
        cursor: pointer;
        font-weight: 500;
        text-decoration: none !important;
        display: inline-flex;
        align-items: center;
        gap: 6px;
        transition: all 0.2s;
        color: #ffffff !important;
    }

    .btn-accion:visited {
        color: #ffffff !important;
    }

    /* ← Volver al listado */
    .btn-secondary {
        background: #757575;
        color: #ffffff !important;
    }

    .btn-secondary:hover {
        background: #1a1a1a;
        color: #ffffff !important;
        text-decoration: none !important;
    }

    /* ↻ Recalcular Progreso */
    .btn-primary {
        background: #667eea;
        color: #ffffff !important;
    }

    .btn-primary:hover {
        background: #1a237e;
        color: #ffffff !important;
        text-decoration: none !important;
    }

    /* ✎ Editar */
    .btn-warning {
        background: #ff9800;
        color: #ffffff !important;
    }

    .btn-warning:hover {
        background: #bf360c;
        color: #ffffff !important;
        text-decoration: none !important;
    }

    /* ✓ Cerrar Proyecto */
    .btn-success {
        background: #4CAF50;
        color: #ffffff !important;
    }

    .btn-success:hover {
        background: #1b5e20;
        color: #ffffff !important;
        text-decoration: none !important;
    }

    /* ✕ Eliminar */
    .btn-danger {
        background: #f44336;
        color: #ffffff !important;
    }

    .btn-danger:hover {
        background: #7f0000;
        color: #ffffff !important;
        text-decoration: none !important;
    }

    /* Botones de acción en tabla - Finalizar */
    .btn-finalizar-actividad {
        background: none;
        border: none;
        cursor: pointer;
        padding: 6px;
        border-radius: 4px;
        transition: background 0.2s;
        display: inline-flex;
        align-items: center;
        justify-content: center;
    }

    .btn-finalizar-actividad:hover {
        background: rgba(240, 163, 47, 0.15);
    }

    .btn-finalizar-actividad svg {
        width: 22px;
        height: 22px;
    }

    .finalizar-todo-container {
        display: flex;
        justify-content: flex-end;
        gap: 12px;
        margin-top: 10px;
        padding-right: 5px;
    }

    .color-finalizar-btn {
        font-weight: 600;
        cursor: pointer;
        font-size: 13px;
        color: #f0a32f;
        display: inline-flex;
        align-items: center;
        gap: 4px;
    }

    .color-finalizar-btn:hover {
        opacity: 0.8;
    }

    .color-finalizar-btn svg {
        width: 20px;
        height: 20px;
    }

    /* Botones SVG de acción en tabla (IA, finalizar, etc.) */
    .admin-accion-btns {
        display: flex;
        align-items: center;
        justify-content: center;
        gap: 2px;
    }

    .btn-accion-tabla {
        background: none;
        border: none;
        cursor: pointer;
        padding: 4px;
        border-radius: 4px;
        transition: background 0.2s;
        display: inline-flex;
        align-items: center;
        justify-content: center;
    }

    .btn-accion-tabla:hover {
        background: rgba(0, 0, 0, 0.06);
    }

    .btn-accion-tabla svg {
        width: 20px;
        height: 20px;
    }

    /* Contenedor SIEinteligente */
    #adminTituloIA {
        display: none;
        text-align: center;
    }

    .admin-cajon-ia {
        height: 250px;
        overflow-y: auto;
        border: 1px solid #ababab;
        display: none;
        margin-bottom: 40px;
        margin-top: 15px;
        background-color: #00a9ff17;
        border-radius: 25px;
        padding: 40px;
    }

    /* Overlay del loader */
    #admin-loader-overlay {
        position: fixed;
        top: 0;
        left: 0;
        width: 100vw;
        height: 100vh;
        background-color: rgba(0, 0, 0, 0.62);
        display: none;
        justify-content: center;
        align-items: center;
        z-index: 9999;
    }

    #admin-loader {
        width: 100px;
        height: 100px;
        border: 8px solid #ccc;
        border-top: 8px solid #4a90e2;
        border-radius: 50%;
        animation: admin-spin 1s linear infinite;
    }

    @keyframes admin-spin {
        to { transform: rotate(360deg); }
    }

    /* ── Tareas, Seguimiento y Participantes ── */
    .admin-two-col {
        display: grid;
        grid-template-columns: 1fr 250px;
        gap: 15px;
        margin-top: 25px;
    }
    @media (max-width: 900px) {
        .admin-two-col { grid-template-columns: 1fr; }
    }
    .admin-section-card {
        background: #fff;
        border-radius: 8px;
        box-shadow: 0 1px 4px rgba(0,0,0,0.08);
        padding: 18px;
        margin-bottom: 15px;
    }
    .admin-section-card h3 {
        margin: 0 0 12px; font-size: 1.05em; color: #2c3e50;
    }
    /* Tareas — estilo card tipo BEZ */
    .admin-task-card {
        border: 1px solid #e0e0e0; border-radius: 6px; padding: 12px 14px;
        margin-bottom: 10px; background: #fff; font-size: 0.88em;
        box-shadow: 0 1px 3px rgba(0,0,0,0.04);
    }
    .admin-task-card.done { opacity: 0.6; }
    .admin-task-card.done .admin-task-body { text-decoration: line-through; }
    .admin-task-card.admin-task-overdue { border-left: 3px solid #e53935; }
    .admin-task-header-grid {
        display: grid; grid-template-columns: 1fr 1fr; gap: 2px 16px;
        font-size: 0.82em; color: #555; margin-bottom: 8px;
    }
    .admin-task-header-grid b { color: #333; font-weight: 600; }
    .admin-task-body { padding: 6px 0; font-size: 0.92em; border-top: 1px solid #f0f0f0; }
    .admin-task-body p { margin: 0; }
    .admin-task-body h1, .admin-task-body h2, .admin-task-body h3, .admin-task-body h4 { font-size: 1em; margin: 0; }
    .admin-task-actions { display: flex; gap: 8px; align-items: center; padding-top: 6px; border-top: 1px solid #f0f0f0; margin-top: 6px; flex-wrap: wrap; }
    .admin-task-action-btn { background: #f8f9fa; border: 1px solid #ddd; border-radius: 4px; padding: 4px 10px; cursor: pointer; font-size: 0.8em; color: #555; }
    .admin-task-action-btn:hover { background: #e9ecef; border-color: #bbb; }
    .admin-task-action-btn.btn-danger { color: #fff; background: #e53935; border-color: #c62828; }
    .admin-task-action-btn.btn-danger:hover { background: #c62828; }
    .admin-task-action-btn.btn-success { color: #fff; background: #388e3c; border-color: #2e7d32; }
    .admin-task-action-btn.btn-success:hover { background: #2e7d32; }
    .admin-task-status { font-size: 0.78em; font-weight: 600; padding: 2px 8px; border-radius: 10px; }
    .admin-task-status.open { background: #fff3e0; color: #e65100; }
    .admin-task-status.closed { background: #e8f5e9; color: #2e7d32; }
    #adminTaskForm { background: #f8f9fa; border-radius: 6px; padding: 12px; margin-bottom: 10px; }
    #adminTaskForm input, #adminTaskForm select { padding: 6px 8px; border: 1px solid #ddd; border-radius: 4px; font-size: 0.9em; }
    #adminTaskForm input[type="text"] { width: 100%; margin-bottom: 6px; }
    .admin-form-row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
    .admin-btn-sm { padding: 5px 12px; border: none; border-radius: 4px; cursor: pointer; font-size: 0.85em; }
    .admin-btn-add { background: #4CAF50; color: #fff; }
    .admin-btn-add:hover { background: #388E3C; }
    .admin-btn-cancel { background: #ccc; color: #333; }
    .admin-btn-show-form { background: #3498db; color: #fff; padding: 6px 14px; border: none; border-radius: 4px; cursor: pointer; font-size: 0.9em; margin-bottom: 10px; }
    .admin-btn-show-form:hover { background: #2980b9; }
    /* Seguimiento */
    .admin-comment-card {
        border-left: 3px solid #3498db; background: #f8f9fa;
        border-radius: 0 6px 6px 0; padding: 10px 14px; margin-bottom: 10px;
    }
    .admin-comment-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 5px; }
    .admin-comment-author { font-weight: 600; color: #2c3e50; font-size: 0.9em; }
    .admin-comment-date { color: #999; font-size: 0.8em; }
    .admin-comment-body { font-size: 0.9em; color: #333; }
    .admin-comment-delete { background: none; border: none; color: #e53935; cursor: pointer; font-size: 0.85em; }
    /* #adminCommentText removido — reemplazado por Pell editor */
    /* Participantes */
    .admin-participant-item {
        display: flex; align-items: center; gap: 8px;
        padding: 6px 0; border-bottom: 1px solid #f0f0f0; font-size: 0.9em;
    }
    .admin-participant-item:last-child { border-bottom: none; }
    .admin-badge { padding: 2px 6px; border-radius: 10px; font-size: 0.68em; font-weight: 600; white-space: nowrap; flex-shrink: 0; }
    .admin-badge-creator { background: #e8d5f5; color: #6a1b9a; }
    .admin-badge-participant { background: #e3f2fd; color: #1565c0; }
    .admin-participant-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 0.85em; }
    .admin-participant-remove { background: none; border: none; color: #e53935; cursor: pointer; font-size: 0.9em; }
    #adminParticipantUser { padding: 5px 8px; border: 1px solid #ddd; border-radius: 4px; font-size: 0.85em; flex: 1; }
    .admin-right-col .admin-section-card { position: sticky; top: 10px; overflow: hidden; }
    .admin-right-col { min-width: 0; }
    /* Editor rico Pell */
    .pell { border: 1px solid #ddd; border-radius: 6px; overflow: hidden; }
    .pell-actionbar { background: #f8f9fa; border-bottom: 1px solid #ddd; padding: 4px; }
    .pell-button { background: none; border: 1px solid transparent; border-radius: 3px; padding: 4px 8px; cursor: pointer; font-size: 14px; }
    .pell-button:hover { background: #e9ecef; }
    .pell-content { min-height: 60px; padding: 8px; font-size: 0.88em; outline: none; overflow-wrap: break-word; }
    .pell:focus-within { border-color: #3498db; }
    /* .admin-task-author y .admin-task-seccion removidos — reemplazados por header-grid */
    /* Sección header para agrupación */
    .admin-task-group-header { font-size: 0.85em; font-weight: 600; color: #2c3e50; padding: 8px 0 4px; border-bottom: 1px solid #e0e0e0; margin-top: 10px; }
    .admin-task-group-header:first-child { margin-top: 0; }
    /* Tarea vencida */
    .admin-task-overdue .admin-task-meta { color: #e53935 !important; font-weight: bold; }
    /* .admin-task-content-html removido — reemplazado por .admin-task-body */
    /* Respuestas anidadas — visualmente unidas al comentario padre */
    .admin-comment-replies { margin-left: 25px; padding-left: 12px; border-left: 2px solid #90caf9; margin-top: 6px; }
    .admin-comment-reply { border-left: none; background: #f0f7ff; margin-bottom: 6px; padding: 8px 12px; border-radius: 0 6px 6px 0; }
    .admin-comment-reply:last-child { margin-bottom: 0; }
    .admin-comment-reply .admin-comment-author::before { content: '↳ '; color: #64b5f6; }
    .admin-comment-reply .admin-comment-author { font-size: 0.82em; }
    .admin-comment-reply .admin-comment-body { font-size: 0.85em; }
    /* Botones editar/responder */
    .admin-comment-edit, .admin-comment-reply-btn { background: none; border: none; cursor: pointer; font-size: 0.8em; padding: 2px 6px; border-radius: 3px; }
    .admin-comment-edit { color: #f57c00; }
    .admin-comment-edit:hover { background: #fff3e0; }
    .admin-comment-reply-btn { color: #1976d2; }
    .admin-comment-reply-btn:hover { background: #e3f2fd; }
    .admin-comment-edited { color: #999; font-size: 0.75em; font-style: italic; }
    /* Color picker simple */
    .admin-color-picker { display: inline-flex; gap: 2px; padding: 4px; }
    .admin-color-dot { width: 18px; height: 18px; border-radius: 50%; border: 1px solid #ccc; cursor: pointer; }
    .admin-color-dot:hover { transform: scale(1.2); }
</style>

<div class="admin-thread-container">

    <!-- Header -->
    <div class="admin-thread-header">
        <h1>📋 Proyecto Administrativo #<?php echo intval($proyecto['id']) ?></h1>
        <div class="meta">
            <span>👤 <?php echo htmlspecialchars($proyecto['trabajador_nombre']) ?></span>
            <span>📅 <?php echo !empty($proyecto['fecha_inicio']) ? date('d/m/Y', strtotime($proyecto['fecha_inicio'])) : date('d/m/Y', strtotime($proyecto['created_at'])) ?></span>
            <span class="estado-badge estado-<?php echo htmlspecialchars($proyecto['state']) ?>">
                <?php if ($proyecto['state'] === 'opened'): ?>● Abierto<?php elseif ($proyecto['state'] === 'closed'): ?>○ Cerrado<?php else: ?>◆ Compilado<?php endif; ?>
            </span>
        </div>
    </div>

    <!-- Progreso Total -->
    <div class="progreso-total">
        <h3>Progreso General</h3>
        <?php
        $porcentajeTotal = floatval($proyecto['porcentaje_total']);
        ?>
        <div class="porcentaje-grande"><?php echo $porcentajeTotal ?>%</div>
        <div class="progress-bar-container" style="max-width: 400px; margin: 15px auto; height: 30px;">
            <?php
            $colorClass = 'progress-red';
            if ($porcentajeTotal >= 100) $colorClass = 'progress-green';
            elseif ($porcentajeTotal >= 50) $colorClass = 'progress-blue';
            elseif ($porcentajeTotal >= 30) $colorClass = 'progress-orange';
            ?>
            <div class="progress-bar <?php echo $colorClass ?>" style="width: <?php echo $porcentajeTotal ?>%;">
                <?php echo $porcentajeTotal ?>%
            </div>
        </div>
        <div class="detalle">
            <?php echo $proyecto['tareas_completadas'] ?> de <?php echo $proyecto['total_tareas'] ?> tareas completadas
        </div>
    </div>

    <!-- Tabla de Secciones/Botones -->
    <div class="progress-table-container">
        <table class="progress-table">
            <thead>
                <tr>
                    <th style="width: 35%;">Sección</th>
                    <th>Total</th>
                    <th>Completadas</th>
                    <th style="width: 25%;">Progreso</th>
                    <?php if ($puedeFinalizar): ?>
                    <th style="width: 15%;">Acción</th>
                    <?php endif; ?>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($secciones as $seccion): ?>
                <tr>
                    <td class="seccion-nombre">
                        <a href="?id=<?php echo htmlspecialchars($seccion['ruta_wiki'], ENT_QUOTES) ?>">
                            <?php echo intval($seccion['seccion_id']) ?>. <?php echo htmlspecialchars($seccion['seccion_nombre']) ?>
                        </a>
                    </td>

                    <?php if ($seccion['aporta_progreso']): ?>
                        <td>
                            <input type="hidden" id="admin_req_totales_<?php echo intval($seccion['seccion_id']) ?>" value="<?php echo $seccion['total_requerimientos'] ?: 'N/A' ?>">
                            <?php echo $seccion['total_requerimientos'] ?: 'N/A' ?>
                        </td>
                        <td><?php echo $seccion['requerimientos_terminados'] ?></td>
                        <td>
                            <?php
                            $porcentaje = floatval($seccion['porcentaje_progreso']);
                            $colorClass = 'progress-red';
                            if ($porcentaje >= 100) $colorClass = 'progress-green';
                            elseif ($porcentaje >= 50) $colorClass = 'progress-blue';
                            elseif ($porcentaje >= 30) $colorClass = 'progress-orange';
                            ?>
                            <div class="progress-bar-container">
                                <div class="progress-bar <?php echo $colorClass ?>" style="width: <?php echo $porcentaje ?>%;">
                                    <?php echo $porcentaje ?>%
                                </div>
                            </div>
                        </td>
                        <?php if ($puedeFinalizar): ?>
                        <td style="vertical-align: middle;">
                            <div class="admin-accion-btns">
                                <button class="btn-accion-tabla" title="Histórico Resumen SIEinteligente" onclick="consultarHistoricoAdminIA('<?php echo htmlspecialchars($seccion['ruta_wiki'], ENT_QUOTES) ?>', '<?php echo htmlspecialchars($seccion['seccion_nombre'], ENT_QUOTES) ?>')">
                                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                                        <path fill="#dddf42c2" d="M15,13H16.5V15.82L18.94,17.23L18.19,18.53L15,16.69V13M19,8H5V19H9.67C9.24,18.09 9,17.07 9,16A7,7 0 0,1 16,9C17.07,9 18.09,9.24 19,9.67V8M5,21C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V11.1C22.24,12.36 23,14.09 23,16A7,7 0 0,1 16,23C14.09,23 12.36,22.24 11.1,21H5M16,11.15A4.85,4.85 0 0,0 11.15,16C11.15,18.68 13.32,20.85 16,20.85A4.85,4.85 0 0,0 20.85,16C20.85,13.32 18.68,11.15 16,11.15Z" />
                                    </svg>
                                </button>
                                <button class="btn-accion-tabla" title="Generar Resumen SIEinteligente" onclick="consultarArchivosAdminProyecto('<?php echo htmlspecialchars($seccion['ruta_wiki'], ENT_QUOTES) ?>', '<?php echo htmlspecialchars($seccion['seccion_nombre'], ENT_QUOTES) ?>', 'Administrativo')">
                                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                                        <path fill="#dcdf42ff" d="M7 5.6L5.6 7L3.5 4.9L4.9 3.5L7 5.6M1 13H4V11H1V13M13 1H11V4H13V1M10 22C10 22.6 10.4 23 11 23H13C13.6 23 14 22.6 14 22V21H10V22M20 11V13H23V11H20M19.1 3.5L17 5.6L18.4 7L20.5 4.9L19.1 3.5M18 12C18 14.2 16.8 16.2 15 17.2V19C15 19.6 14.6 20 14 20H10C9.4 20 9 19.6 9 19V17.2C7.2 16.2 6 14.2 6 12C6 8.7 8.7 6 12 6S18 8.7 18 12M8.56 10H15.44C14.75 8.81 13.5 8 12 8S9.25 8.81 8.56 10Z" />
                                    </svg>
                                </button>
                                <button class="btn-accion-tabla" title="Finalizar Actividad" onclick="finalizarAdminSeccion(<?php echo intval($seccion['seccion_id']) ?>, <?php echo intval($proyecto['id']) ?>)">
                                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                                        <path fill="#f0a32f" d="M14.4,6H20V16H13L12.6,14H7V21H5V4H14L14.4,6M14,14H16V12H18V10H16V8H14V10L13,8V6H11V8H9V6H7V8H9V10H7V12H9V10H11V12H13V10L14,12V14M11,10V8H13V10H11M14,10H16V12H14V10Z" />
                                    </svg>
                                </button>
                            </div>
                        </td>
                        <?php endif; ?>
                    <?php else: ?>
                        <td colspan="<?php echo $puedeFinalizar ? '4' : '3' ?>">
                            <span class="seccion-no-progreso">Solo acceso</span>
                        </td>
                    <?php endif; ?>
                </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
    </div>

    <?php if ($puedeFinalizar): ?>
    <div class="finalizar-todo-container">
        <span class="color-finalizar-btn" title="Finalizar todos los requisitos administrativos" onclick="finalizarTodosRequisitosAdmin(<?php echo intval($proyecto['id']) ?>);">
            Finalizar requisitos administrativos
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                <path fill="#f0a32f" d="M14.4,6H20V16H13L12.6,14H7V21H5V4H14L14.4,6M14,14H16V12H18V10H16V8H14V10L13,8V6H11V8H9V6H7V8H9V10H7V12H9V10H11V12H13V10L14,12V14M11,10V8H13V10H11M14,10H16V12H14V10Z" />
            </svg>
        </span>
    </div>
    <?php endif; ?>

    <!-- ══ Tareas, Seguimiento y Participantes ══ -->
    <div class="admin-two-col">
        <div class="admin-left-col">

            <!-- TAREAS -->
            <div class="admin-section-card">
                <h3>📋 Tareas</h3>

                <?php if ($puedeEditar || $esParticipante): ?>
                <button type="button" class="admin-btn-show-form" onclick="document.getElementById('adminTaskForm').style.display=document.getElementById('adminTaskForm').style.display==='none'?'block':'none'">+ Agregar Tarea</button>
                <div id="adminTaskForm" style="display:none;">
                    <div id="adminTaskEditor"></div>
                    <div class="admin-form-row" style="margin-top:8px;">
                        <select id="adminTaskSeccion">
                            <option value="">-- Capítulo --</option>
                            <?php foreach ($seccionesMap as $sid => $sname): ?>
                            <option value="<?php echo intval($sid) ?>"><?php echo htmlspecialchars($sname) ?></option>
                            <?php endforeach; ?>
                            <option value="otros">Otros</option>
                        </select>
                        <select id="adminTaskAssignee">
                            <option value="">-- Asignar a --</option>
                            <?php foreach ($allUsers as $u): ?>
                            <option value="<?php echo htmlspecialchars($u['username']) ?>"><?php echo htmlspecialchars($u['name']) ?> (<?php echo htmlspecialchars($u['username']) ?>)</option>
                            <?php endforeach; ?>
                        </select>
                        <input type="date" id="adminTaskDate" style="max-width:150px;">
                        <button type="button" class="admin-btn-sm admin-btn-add" onclick="agregarTareaAdmin()">Agregar</button>
                        <button type="button" class="admin-btn-sm admin-btn-cancel" onclick="document.getElementById('adminTaskForm').style.display='none'">Cancelar</button>
                    </div>
                </div>
                <?php endif; ?>

                <?php if (empty($tareas)): ?>
                    <p style="color:#999; font-size:0.9em;">No hay tareas asignadas.</p>
                <?php else: ?>
                    <?php
                    $tareasAgrupadas = [];
                    foreach ($tareas as $t) {
                        $sid = isset($t['seccion_id']) && $t['seccion_id'] !== null && $t['seccion_id'] !== '' ? intval($t['seccion_id']) : 0;
                        $tareasAgrupadas[$sid][] = $t;
                    }
                    ksort($tareasAgrupadas);
                    $hoy = date('Y-m-d');
                    ?>
                    <?php foreach ($tareasAgrupadas as $gid => $grupoTareas): ?>
                        <div class="admin-task-group-header">
                            <?php echo $gid > 0 && isset($seccionesMap[$gid]) ? htmlspecialchars($seccionesMap[$gid]) : 'Otros'; ?>
                            <span style="color:#999; font-size:0.85em;">(<?php echo count($grupoTareas) ?>)</span>
                        </div>
                        <?php foreach ($grupoTareas as $t):
                            $isOverdue = !empty($t['plan_date']) && $t['state'] === 'opened' && $t['plan_date'] < $hoy;
                            $creadorNombre = isset($userNamesMap[$t['created_by']]) ? $userNamesMap[$t['created_by']] : $t['created_by'];
                            $responsableNombre = !empty($t['assignee']) ? (isset($userNamesMap[$t['assignee']]) ? $userNamesMap[$t['assignee']] : $t['assignee']) : $creadorNombre;
                            $capituloNombre = isset($t['seccion_id']) && $t['seccion_id'] && isset($seccionesMap[intval($t['seccion_id'])]) ? $seccionesMap[intval($t['seccion_id'])] : 'Otros';
                        ?>
                        <div class="admin-task-card <?php echo $t['state'] === 'done' ? 'done' : '' ?> <?php echo $isOverdue ? 'admin-task-overdue' : '' ?>">
                            <div class="admin-task-header-grid">
                                <span><b>Creador:</b> <?php echo htmlspecialchars($creadorNombre) ?></span>
                                <span><b>Responsable:</b> <?php echo htmlspecialchars($responsableNombre) ?></span>
                                <span><b>Plazo limite:</b> <?php echo !empty($t['plan_date']) ? date('Y-m-d', strtotime($t['plan_date'])) : '---' ?></span>
                                <span><b>Capitulo:</b> <?php echo htmlspecialchars($capituloNombre) ?></span>
                            </div>
                            <div class="admin-task-body"><?php echo !empty($t['content_html']) ? $t['content_html'] : htmlspecialchars($t['content']) ?></div>
                            <div class="admin-task-actions">
                                <?php if ($puedeEditar): ?>
                                <button type="button" class="admin-task-action-btn <?php echo $t['state'] === 'done' ? 'btn-success' : '' ?>" onclick="toggleTareaAdmin(<?php echo intval($t['id']) ?>)">
                                    <?php echo $t['state'] === 'done' ? '↺ Reabrir' : '✓ Finalizar' ?>
                                </button>
                                <?php else: ?>
                                <span class="admin-task-status <?php echo $t['state'] === 'done' ? 'closed' : 'open' ?>">
                                    <?php echo $t['state'] === 'done' ? 'Cerrada' : 'Abierta' ?>
                                </span>
                                <?php endif; ?>
                                <?php if ($puedeEditar && ($isAdminThreadGod || ($t['created_by'] === $currentUser))): ?>
                                <button type="button" class="admin-task-action-btn btn-danger" onclick="eliminarTareaAdmin(<?php echo intval($t['id']) ?>)">✕ Borrar</button>
                                <?php endif; ?>
                                <?php if ($puedeEditar): ?>
                                <button type="button" class="admin-task-action-btn" onclick="notificarTareaAdmin(<?php echo intval($t['id']) ?>)">✉ Notificar</button>
                                <?php endif; ?>
                            </div>
                        </div>
                        <?php endforeach; ?>
                    <?php endforeach; ?>
                <?php endif; ?>
            </div>

            <!-- SEGUIMIENTO -->
            <div class="admin-section-card">
                <h3>💬 Seguimiento</h3>

                <?php if (empty($comentarios)): ?>
                    <p style="color:#999; font-size:0.9em;">No hay comentarios de seguimiento.</p>
                <?php else: ?>
                    <?php
                    // Separar top-level y respuestas
                    $topComments = [];
                    $replies = [];
                    foreach ($comentarios as $c) {
                        $pid = isset($c['parent_id']) && $c['parent_id'] ? intval($c['parent_id']) : 0;
                        if ($pid === 0) {
                            $topComments[] = $c;
                        } else {
                            $replies[$pid][] = $c;
                        }
                    }
                    ?>
                    <?php foreach ($topComments as $c):
                        $commentAuthorName = isset($userNamesMap[$c['author']]) ? $userNamesMap[$c['author']] : $c['author'];
                    ?>
                    <div class="admin-comment-card" id="comment-<?php echo intval($c['id']) ?>">
                        <div class="admin-comment-header">
                            <span class="admin-comment-author"><?php echo htmlspecialchars($commentAuthorName) ?></span>
                            <span>
                                <?php if (!empty($c['updated_at'])): ?>
                                <span class="admin-comment-edited">(editado)</span>
                                <?php endif; ?>
                                <span class="admin-comment-date"><?php echo date('d/m/Y H:i', strtotime($c['created_at'])) ?></span>
                                <?php if ($c['author'] === $currentUser || $isAdminThreadGod): ?>
                                <button type="button" class="admin-comment-edit" onclick="editarComentarioAdmin(<?php echo intval($c['id']) ?>, this)" title="Editar">✎</button>
                                <?php endif; ?>
                                <?php if ($puedeEditar || $esParticipante): ?>
                                <button type="button" class="admin-comment-reply-btn" onclick="responderComentarioAdmin(<?php echo intval($c['id']) ?>)" title="Responder">↩</button>
                                <?php endif; ?>
                                <?php if ($isAdminThreadGod): ?>
                                <button type="button" class="admin-comment-delete" onclick="eliminarComentarioAdmin(<?php echo intval($c['id']) ?>)" title="Eliminar">✕</button>
                                <?php endif; ?>
                            </span>
                        </div>
                        <div class="admin-comment-body" id="comment-body-<?php echo intval($c['id']) ?>"><?php echo $c['content_html'] ?: nl2br(htmlspecialchars($c['content'])) ?></div>
                        <?php // Renderizar respuestas anidadas debajo del comentario padre ?>
                        <?php if (!empty($replies[intval($c['id'])])): ?>
                        <div class="admin-comment-replies">
                            <?php foreach ($replies[intval($c['id'])] as $r):
                                $replyAuthorName = isset($userNamesMap[$r['author']]) ? $userNamesMap[$r['author']] : $r['author'];
                            ?>
                            <div class="admin-comment-reply" id="comment-<?php echo intval($r['id']) ?>">
                                <div class="admin-comment-header">
                                    <span class="admin-comment-author"><?php echo htmlspecialchars($replyAuthorName) ?></span>
                                    <span>
                                        <?php if (!empty($r['updated_at'])): ?>
                                        <span class="admin-comment-edited">(editado)</span>
                                        <?php endif; ?>
                                        <span class="admin-comment-date"><?php echo date('d/m/Y H:i', strtotime($r['created_at'])) ?></span>
                                        <?php if ($r['author'] === $currentUser || $isAdminThreadGod): ?>
                                        <button type="button" class="admin-comment-edit" onclick="editarComentarioAdmin(<?php echo intval($r['id']) ?>, this)" title="Editar">✎</button>
                                        <?php endif; ?>
                                        <?php if ($isAdminThreadGod): ?>
                                        <button type="button" class="admin-comment-delete" onclick="eliminarComentarioAdmin(<?php echo intval($r['id']) ?>)" title="Eliminar">✕</button>
                                        <?php endif; ?>
                                    </span>
                                </div>
                                <div class="admin-comment-body" id="comment-body-<?php echo intval($r['id']) ?>"><?php echo $r['content_html'] ?: nl2br(htmlspecialchars($r['content'])) ?></div>
                            </div>
                            <?php endforeach; ?>
                        </div>
                        <?php endif; ?>
                    </div>
                    <?php endforeach; ?>
                <?php endif; ?>

                <?php if ($puedeEditar || $esParticipante): ?>
                <div style="margin-top: 10px;">
                    <div id="adminCommentEditor"></div>
                    <button type="button" class="admin-btn-sm admin-btn-add" style="margin-top:6px;" onclick="agregarComentarioAdmin()">Agregar comentario</button>
                </div>
                <?php endif; ?>
            </div>

        </div>
        <div class="admin-right-col">

            <!-- PARTICIPANTES -->
            <div class="admin-section-card">
                <h3>👥 Participantes</h3>

                <?php if (empty($participantes)): ?>
                    <p style="color:#999; font-size:0.85em;">Sin participantes.</p>
                <?php else: ?>
                    <?php foreach ($participantes as $p): ?>
                    <div class="admin-participant-item">
                        <span class="admin-participant-name"><?php echo htmlspecialchars(isset($userNamesMap[$p['user_id']]) ? $userNamesMap[$p['user_id']] : $p['user_id']) ?></span>
                        <span class="admin-badge <?php echo $p['role'] === 'creator' ? 'admin-badge-creator' : 'admin-badge-participant' ?>">
                            <?php echo $p['role'] === 'creator' ? 'Creador' : 'Participante' ?>
                        </span>
                        <?php if ($isAdminThreadGod && $p['role'] !== 'creator'): ?>
                        <button type="button" class="admin-participant-remove" onclick="removerParticipanteAdmin(<?php echo intval($p['id']) ?>)" title="Remover">✕</button>
                        <?php endif; ?>
                    </div>
                    <?php endforeach; ?>
                <?php endif; ?>

                <?php if ($isAdminThreadGod): ?>
                <div style="margin-top: 10px; display: flex; gap: 6px;">
                    <select id="adminParticipantUser" style="flex:1; padding:5px; border:1px solid #ddd; border-radius:4px; font-size:0.85em;">
                        <option value="">-- Agregar usuario --</option>
                        <?php foreach ($allUsers as $u): ?>
                        <option value="<?php echo htmlspecialchars($u['username']) ?>"><?php echo htmlspecialchars($u['name']) ?> (<?php echo htmlspecialchars($u['username']) ?>)</option>
                        <?php endforeach; ?>
                    </select>
                    <button type="button" class="admin-btn-sm admin-btn-add" onclick="agregarParticipanteAdmin()">+</button>
                </div>
                <?php endif; ?>
            </div>

        </div>
    </div>
    <!-- ══ FIN Tareas, Seguimiento y Participantes ══ -->

    <!-- Contenedor SIEinteligente -->
    <h3 id="adminTituloIA" style="text-align: center;"></h3>
    <div id="adminCampoIA" class="admin-cajon-ia"></div>
    <!-- FIN Contenedor SIEinteligente -->

    <!-- Información adicional -->
    <?php if (!empty($proyecto['observaciones'])): ?>
    <div class="info-card">
        <h3>📝 Observaciones</h3>
        <p><?php echo nl2br(htmlspecialchars($proyecto['observaciones'])) ?></p>
    </div>
    <?php endif; ?>

    <!-- Botones de acción -->
    <div class="acciones-container">
        <a href="<?php echo $tpl->url('admin_threads') ?>" class="btn-accion btn-secondary">
            ← Volver al listado
        </a>

        <?php if ($puedeRecalcular): ?>
        <a href="<?php echo $tpl->url('admin_thread', 'id', $proyecto['id'], 'action', 'recalcular') ?>" class="btn-accion btn-primary">
            ↻ Recalcular Progreso
        </a>
        <?php endif; ?>

        <?php if ($puedeEditar): ?>
            <a href="<?php echo $tpl->url('admin_thread_form', 'action', 'edit', 'id', $proyecto['id']) ?>" class="btn-accion btn-warning">
                ✎ Editar
            </a>

            <?php if ($proyecto['state'] === 'opened'): ?>
            <a href="<?php echo $tpl->url('admin_thread', 'id', $proyecto['id'], 'action', 'close') ?>"
               class="btn-accion btn-success"
               onclick="return confirm('¿Cerrar este proyecto?');">
                ✓ Cerrar
            </a>
            <?php elseif (in_array($proyecto['state'], ['closed', 'compilado'])): ?>
            <a href="<?php echo $tpl->url('admin_thread', 'id', $proyecto['id'], 'action', 'reopen') ?>"
               class="btn-accion btn-primary">
                ↺ Reabrir Proyecto
            </a>
            <?php endif; ?>

            <?php // RAZÓN #6: Compilar SIEMPRE visible, NO mutuamente excluyente con Cerrar
                  // RAZÓN #3: No depende de task_count
                  // RAZÓN #4: No depende de tareas abiertas
                  if ($proyecto['state'] !== 'compilado'): ?>
            <a href="<?php echo $tpl->url('admin_thread', 'id', $proyecto['id'], 'action', 'compilar') ?>"
               class="btn-accion btn-warning"
               onclick="return confirm('¿Compilar este proyecto? No será visible en el filtro.');">
                ⬢ Compilar
            </a>
            <?php endif; ?>

            <a href="<?php echo $tpl->url('admin_thread', 'id', $proyecto['id'], 'action', 'delete') ?>"
               class="btn-accion btn-danger"
               onclick="return confirm('¿Eliminar este proyecto? Esta acción no se puede deshacer.');">
                ✕ Eliminar
            </a>
        <?php endif; ?>
    </div>

</div>

<!-- Loader overlay para IA -->
<div id="admin-loader-overlay">
    <div id="admin-loader"></div>
</div>

<?php if ($puedeFinalizar): ?>
<!-- SweetAlert2 para confirmaciones -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
    // Token CSRF de DokuWiki para llamadas AJAX seguras
    var ADMIN_SECTOK = '<?php echo getSecurityToken(); ?>';

    /**
     * Convierte encabezados Markdown (## Titulo, ### Titulo, etc.) a formato DokuWiki.
     * La IA a veces responde con formato Markdown en vez de DokuWiki.
     */
    function transformarMarkdownADokuWiki(texto) {
        if (!texto) return texto;
        return texto.split('\n').map(function(linea) {
            var trimmed = linea.trim();
            var match = trimmed.match(/^(#{1,6})\s+(.+)$/);
            if (match) {
                var nivel = match[1].length;
                var titulo = match[2].trim();
                if (nivel <= 4) {
                    var signos = 7 - nivel;
                    var eq = '';
                    for (var i = 0; i < signos; i++) eq += '=';
                    return eq + ' ' + titulo + ' ' + eq;
                } else {
                    return '**' + titulo + '**';
                }
            }
            return linea;
        }).join('\n');
    }

    /**
     * Transforma tablas de verificación SI/NO en la respuesta de IA.
     * Reemplaza "SI" por "X" y "NO" por " " (vacío) en celdas de tablas DokuWiki.
     * Solo afecta celdas cuyo valor EXACTO sea "SI" o "NO" (no texto parcial).
     */
    function transformarTablaSINO(texto) {
        if (!texto) return texto;
        return texto.split('\n').map(function(linea) {
            var trimmed = linea.trim();
            if (trimmed.charAt(0) !== '|') return linea;
            var partes = linea.split('|');
            for (var i = 0; i < partes.length; i++) {
                var valor = partes[i].trim();
                if (valor === 'SI' || valor === 'Si' || valor === 'si' || valor === 'Sí' || valor === 'sí' || valor === 'SÍ') {
                    partes[i] = ' X ';
                } else if (valor === 'NO' || valor === 'No' || valor === 'no') {
                    partes[i] = '   ';
                }
            }
            return partes.join('|');
        }).join('\n');
    }

    // Finalizar una sección/actividad administrativa individual
    function finalizarAdminSeccion(seccionId, adminThreadId) {
        var totalEl = document.getElementById('admin_req_totales_' + seccionId);
        if (totalEl && totalEl.value === 'N/A') {
            Swal.fire({
                icon: "error",
                title: "Antes...",
                text: "Se solicita ingresar al módulo y revisar las actividades correspondientes.",
                customClass: { confirmButton: "btn-confirm" }
            });
            return;
        }

        Swal.fire({
            title: "¿Estás Seguro?",
            html: "Se marcarán como <b>completadas</b> todas las tareas pendientes de esta sección y se actualizará el progreso al 100%.",
            icon: "warning",
            showCancelButton: true,
            confirmButtonText: "¡Sí, Finalizar!",
            cancelButtonText: "Cancelar",
            customClass: { confirmButton: "btn-confirm", cancelButton: "btn-cancel" }
        }).then(function(result) {
            if (result.isConfirmed) {
                Swal.fire({
                    title: "Finalizando...",
                    text: "Marcando tareas pendientes como completadas.",
                    allowOutsideClick: false,
                    allowEscapeKey: false,
                    didOpen: function() { Swal.showLoading(); }
                });

                jQuery.ajax({
                    url: '<?php echo DOKU_BASE; ?>' + 'lib/plugins/bez/meta/ajax_handler.php',
                    type: "POST",
                    data: {
                        accion: "finalizarAdminSeccion",
                        seccion_id: seccionId,
                        admin_thread_id: adminThreadId,
                        sectok: ADMIN_SECTOK
                    },
                    dataType: "json",
                    success: function(response) {
                        if (response.status === "success") {
                            Swal.fire({
                                title: "¡Finalizado!",
                                text: response.mensaje,
                                icon: "success",
                                customClass: { confirmButton: "btn-confirm" }
                            }).then(function() { location.reload(); });
                        } else if (response.status === "sin_visitar") {
                            Swal.fire({
                                icon: "info",
                                title: "Sección no visitada",
                                text: response.mensaje,
                                customClass: { confirmButton: "btn-confirm" }
                            });
                        } else {
                            Swal.fire({
                                icon: "error",
                                title: "Error",
                                text: response.mensaje || "Error al finalizar sección.",
                                customClass: { confirmButton: "btn-confirm" }
                            });
                        }
                    },
                    error: function() {
                        Swal.fire({
                            icon: "error",
                            title: "Error de conexión",
                            text: "No se pudo conectar con el servidor. Intente nuevamente.",
                            customClass: { confirmButton: "btn-confirm" }
                        });
                    }
                });
            }
        });
    }

    // ===== SIEinteligente - Funciones de IA =====

    // Motor IA local: procesa archivos directamente en el servidor.
    var ADMIN_IA_ENGINE_URL = '<?php echo DOKU_BASE; ?>' + 'lib/plugins/bez/meta/ia_engine.php';

    /**
     * Convierte sintaxis DokuWiki a HTML para vista en vivo.
     */
    function dokuwikiToHtmlAdmin(text) {
        if (!text) return '';
        var html = text;
        html = html.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
        html = html.replace(/&lt;del&gt;(.*?)&lt;\/del&gt;/g, '<del>$1</del>');
        html = html.replace(/^={6}\s*(.+?)\s*={6}\s*$/gm, '<h1>$1</h1>');
        html = html.replace(/^={5}\s*(.+?)\s*={5}\s*$/gm, '<h2>$1</h2>');
        html = html.replace(/^={4}\s*(.+?)\s*={4}\s*$/gm, '<h3>$1</h3>');
        html = html.replace(/^={3}\s*(.+?)\s*={3}\s*$/gm, '<h4>$1</h4>');
        html = html.replace(/^={2}\s*(.+?)\s*={2}\s*$/gm, '<h5>$1</h5>');
        html = html.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');
        html = html.replace(/\/\/(.+?)\/\//g, '<em>$1</em>');
        html = html.replace(/^-{4,}\s*$/gm, '<hr>');
        html = html.replace(/^(\^.+)$/gm, function(match) {
            var cells = match.split('^').filter(function(c) { return c.trim() !== '' || c === ''; });
            var ths = cells.slice(1, -1).map(function(c) { return '<th>' + c.trim() + '</th>'; }).join('');
            return '<table class="inline"><tr>' + ths + '</tr>';
        });
        html = html.replace(/^(\|.+)$/gm, function(match) {
            var cells = match.split('|').filter(function(c) { return c.trim() !== '' || c === ''; });
            var tds = cells.slice(1, -1).map(function(c) { return '<td>' + c.trim() + '</td>'; }).join('');
            return '<tr>' + tds + '</tr>';
        });
        html = html.replace(/(<\/tr>)\n(?!<tr|<\/table)/g, '$1</table>\n');
        if (html.match(/<\/tr>$/)) html += '</table>';
        html = html.replace(/^  \* (.+)$/gm, '<li>$1</li>');
        html = html.replace(/(<li>.*<\/li>\n?)+/g, '<ul>$&</ul>');
        html = html.replace(/^  - (.+)$/gm, '<li>$1</li>');
        html = html.replace(/(<li>.*<\/li>\n?)+/g, function(match) {
            return match.indexOf('<ul>') !== -1 ? match : '<ol>' + match + '</ol>';
        });
        html = html.replace(/\n/g, '<br>\n');
        html = html.replace(/<br>\n(<\/?(?:h[1-5]|hr|table|tr|th|td|ul|ol|li))/g, '\n$1');
        html = html.replace(/(<\/(?:h[1-5]|hr|table|tr|ul|ol|li)>)<br>/g, '$1');
        return html;
    }

    // Consultar historicos de IA (motor local).
    async function adminHistoricosIA(data) {
        data.append('accion', 'consulta-historico');
        var uploadResponse = await fetch(ADMIN_IA_ENGINE_URL, {
            method: "POST",
            body: data
        });
        return uploadResponse.json();
    }

    // Guardar resumen de IA como comentario en la actividad.
    function guardarResumenAdminComentario(comentario, ruta_actividad) {
        var data_comentario = {
            user: { id: "", name: "", mail: "", address: "", url: "" },
            subscribe: false,
            date: { created: "" },
            raw: comentario,
            show: true
        };
        jQuery.ajax({
            url: '<?php echo DOKU_BASE; ?>' + 'lib/plugins/bez/meta/ajax_handler.php',
            type: "POST",
            data: {
                accion: "guardarResumenIAarchivo",
                comentario: data_comentario,
                id: ruta_actividad,
                sectok: ADMIN_SECTOK
            },
            dataType: "json",
            success: function(response) {
                if (response.status === "success") {
                    Swal.fire({
                        title: "¡Perfecto!",
                        text: response.mensaje,
                        icon: "success",
                        customClass: { confirmButton: "btn-confirm" }
                    }).then(function() { location.reload(); });
                } else {
                    Swal.fire({
                        title: "Error",
                        text: response.mensaje,
                        icon: "error",
                        customClass: { confirmButton: "btn-confirm" }
                    });
                }
            },
            error: function() {
                Swal.fire({
                    title: "Error de conexión",
                    text: "No se pudo guardar el resumen. Intente nuevamente.",
                    icon: "error",
                    customClass: { confirmButton: "btn-confirm" }
                });
            }
        });
    }

    // Generar Resumen SIEinteligente para una seccion administrativa (motor local).
    async function consultarArchivosAdminProyecto(ruta_modulo, submodulo, titulo) {
        var mensajeAlerta = '<p>Generar Resumen SIEinteligente!</p>';
        var formData = new FormData();
        formData.append("ruta_actividad", ruta_modulo);
        var result = await adminHistoricosIA(formData);

        if (result.length > 0) {
            mensajeAlerta = '<h5>Previamente se ha generado un <b>RESUMEN de IA</b> para esta seccion.</h5>' +
                '<small><b>Revisa en el icono ' +
                '<svg style="margin-left: 0px !important;" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="18" height="18">' +
                '<path fill="#dddf42c2" d="M15,13H16.5V15.82L18.94,17.23L18.19,18.53L15,16.69V13M19,8H5V19H9.67C9.24,18.09 9,17.07 9,16A7,7 0 0,1 16,9C17.07,9 18.09,9.24 19,9.67V8M5,21C3.89,21 3,20.1 3,19V5C3,3.89 3.89,3 5,3H6V1H8V3H16V1H18V3H19A2,2 0 0,1 21,5V11.1C22.24,12.36 23,14.09 23,16A7,7 0 0,1 16,23C14.09,23 12.36,22.24 11.1,21H5M16,11.15A4.85,4.85 0 0,0 11.15,16C11.15,18.68 13.32,20.85 16,20.85A4.85,4.85 0 0,0 20.85,16C20.85,13.32 18.68,11.15 16,11.15Z" />' +
                '</svg> el resumen!.</small>';
        }

        Swal.fire({
            title: "Estas Seguro?",
            html: mensajeAlerta,
            icon: "warning",
            showCancelButton: true,
            confirmButtonText: "Deseo Generar!",
            cancelButtonText: "Cancelar",
            customClass: { confirmButton: "btn-confirm", cancelButton: "btn-cancel" }
        }).then(async function(swalResult) {
            if (swalResult.isConfirmed) {
                document.getElementById('adminTituloIA').style.display = 'none';
                document.querySelector('.admin-cajon-ia').style.display = 'none';
                document.getElementById('admin-loader-overlay').style.display = 'flex';

                try {
                    // Llamar al motor IA local: el servidor lee archivos directamente del filesystem
                    var fd = new FormData();
                    fd.append('accion', 'resumen-sie');
                    fd.append('ruta_modulo', ruta_modulo);
                    fd.append('submodulo', submodulo);
                    fd.append('titulo', titulo);

                    var response = await fetch(ADMIN_IA_ENGINE_URL, { method: "POST", body: fd });
                    var res = await response.json();

                    if (response.ok && res.status === 'success') {
                        document.getElementById('adminTituloIA').style.display = 'block';
                        document.getElementById('adminTituloIA').innerHTML = submodulo + ' | Resumen SIEinteligente';
                        document.querySelector('.admin-cajon-ia').style.display = 'block';
                        var resumenTransformado = transformarTablaSINO(transformarMarkdownADokuWiki(res.resumen_sie_ia));
                        var html = dokuwikiToHtmlAdmin(resumenTransformado);
                        document.getElementById('adminCampoIA').innerHTML = html;
                        guardarResumenAdminComentario(resumenTransformado, ruta_modulo);
                    } else {
                        Swal.fire({
                            icon: "error",
                            title: "Error",
                            text: res.error || res.mensaje || "Error al generar resumen.",
                            customClass: { confirmButton: "btn-confirm" }
                        });
                    }
                } catch (error) {
                    Swal.fire({
                        icon: "error",
                        title: "Error de conexion",
                        text: "Error: " + error,
                        customClass: { confirmButton: "btn-confirm" }
                    });
                }

                document.getElementById('admin-loader-overlay').style.display = 'none';
            }
        });
    }

    // Consultar histórico de resúmenes IA para una sección administrativa
    async function consultarHistoricoAdminIA(ruta_actividad, submodulo) {
        document.getElementById('adminTituloIA').style.display = 'none';
        document.querySelector('.admin-cajon-ia').style.display = 'none';
        document.getElementById('admin-loader-overlay').style.display = 'flex';

        var formData = new FormData();
        formData.append("ruta_actividad", ruta_actividad);

        try {
            var result = await adminHistoricosIA(formData);

            if (result.length > 0) {
                document.getElementById('adminTituloIA').style.display = 'block';
                document.getElementById('adminTituloIA').innerHTML = '🔎 ' + submodulo + ' | Resumen SIEinteligente 💡';
                document.querySelector('.admin-cajon-ia').style.display = 'block';

                var html = "<div>";
                result.forEach(function(resumen, index) {
                    var resumen_historico = dokuwikiToHtmlAdmin(resumen.resumen_ia);
                    var fecha_historico = resumen.fecha_resumen.replace("T", " ");
                    html += '<h4 style="text-align:center;">🔎 Resumen ' + (index + 1) + ' | ' + fecha_historico + ' 💡</h4> ' + resumen_historico + ' <hr>';
                });
                html += "</div>";
                document.getElementById('adminCampoIA').innerHTML = html;
            } else {
                Swal.fire({
                    icon: "error",
                    title: "Error",
                    text: '❌ Error. No cuenta con histórico de resumen para esta sección.',
                    customClass: { confirmButton: "btn-confirm" }
                });
            }
        } catch (error) {
            Swal.fire({
                icon: "error",
                title: "Error",
                text: '❌ Error al procesar: ' + error,
                customClass: { confirmButton: "btn-confirm" }
            });
        }

        document.getElementById('admin-loader-overlay').style.display = 'none';
    }

    // ===== FIN SIEinteligente =====

    // Finalizar TODOS los requisitos administrativos del proyecto
    function finalizarTodosRequisitosAdmin(adminThreadId) {
        Swal.fire({
            title: "¿Finalizar Requisitos Administrativos?",
            html: "Se marcarán como <b>completadas</b> todas las tareas pendientes de <b>todas las secciones</b> del proyecto administrativo.<br><br><small>Las secciones que no hayan sido visitadas serán omitidas y se le informará cuáles son.</small>",
            icon: "warning",
            showCancelButton: true,
            confirmButtonText: "¡Sí, Finalizar Todo!",
            cancelButtonText: "Cancelar",
            customClass: { confirmButton: "btn-confirm", cancelButton: "btn-cancel" }
        }).then(function(result) {
            if (result.isConfirmed) {
                Swal.fire({
                    title: "Finalizando Requisitos...",
                    text: "Marcando tareas pendientes de todas las secciones como completadas.",
                    allowOutsideClick: false,
                    allowEscapeKey: false,
                    didOpen: function() { Swal.showLoading(); }
                });

                jQuery.ajax({
                    url: '<?php echo DOKU_BASE; ?>' + 'lib/plugins/bez/meta/ajax_handler.php',
                    type: "POST",
                    data: {
                        accion: "finalizarTodosRequisitosAdmin",
                        admin_thread_id: adminThreadId,
                        sectok: ADMIN_SECTOK
                    },
                    dataType: "json",
                    success: function(response) {
                        if (response.status === "success") {
                            Swal.fire({
                                title: "¡Requisitos Finalizados!",
                                text: response.mensaje,
                                icon: "success",
                                customClass: { confirmButton: "btn-confirm" }
                            }).then(function() { location.reload(); });
                        } else if (response.status === "parcial") {
                            Swal.fire({
                                title: "Finalizado Parcialmente",
                                html: response.mensaje + "<br><br><b>" + response.cantidad_saltados + " sección(es) no visitada(s):</b><br><small style='color:#f0a32f;'>" + response.saltados + "</small><br><br><small>Debe ingresar a estas secciones al menos una vez para poder finalizarlas.</small>",
                                icon: "info",
                                customClass: { confirmButton: "btn-confirm" }
                            }).then(function() { location.reload(); });
                        } else {
                            Swal.fire({
                                icon: "error",
                                title: "Error",
                                text: response.mensaje || "Error al finalizar los requisitos.",
                                customClass: { confirmButton: "btn-confirm" }
                            });
                        }
                    },
                    error: function() {
                        Swal.fire({
                            icon: "error",
                            title: "Error de conexión",
                            text: "No se pudo conectar con el servidor. Intente nuevamente.",
                            customClass: { confirmButton: "btn-confirm" }
                        });
                    }
                });
            }
        });
    }

    // (funciones de Tareas/Seguimiento/Participantes movidas a bloque <script> independiente abajo)



</script>
<?php endif; ?>

<!-- Script independiente para Tareas/Seguimiento/Participantes -->
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<link rel="stylesheet" href="https://unpkg.com/pell/dist/pell.min.css">
<script src="https://unpkg.com/pell/dist/pell.min.js"></script>
<script>
    var ADMIN_AJAX_URL = '<?php echo DOKU_BASE; ?>lib/plugins/bez/meta/ajax_handler.php';
    var ADMIN_PROJECT_ID = <?php echo intval($proyecto['id']); ?>;
    var ADMIN_SECTOK = '<?php echo getSecurityToken(); ?>';

    // Helper: POST con fetch nativo
    function _adminPost(params) {
        var formData = new FormData();
        for (var key in params) { if (params[key] !== null && params[key] !== undefined) formData.append(key, params[key]); }
        return fetch(ADMIN_AJAX_URL, { method: 'POST', body: formData })
            .then(function(resp) { return resp.text(); })
            .then(function(raw) {
                try { return JSON.parse(raw); }
                catch(e) {
                    Swal.fire({ icon:'error', title:'Error del servidor', html:'<pre style="text-align:left;font-size:11px;max-height:400px;overflow:auto;">' + raw.substring(0,2000).replace(/</g,'&lt;') + '</pre>' });
                    throw e;
                }
            });
    }

    // Inicializar editores Pell
    var adminTaskPell = null;
    var adminCommentPell = null;

    function _initPellEditor(elementId, placeholder) {
        var el = document.getElementById(elementId);
        if (!el || !window.pell) return null;
        return pell.init({
            element: el,
            onChange: function() {},
            defaultParagraphSeparator: 'p',
            actions: [
                'bold', 'italic', 'underline',
                { name: 'heading1', icon: 'H1', title: 'Titulo 1', result: function() { document.execCommand('formatBlock', false, '<h3>'); } },
                { name: 'heading2', icon: 'H2', title: 'Titulo 2', result: function() { document.execCommand('formatBlock', false, '<h4>'); } },
                'olist', 'ulist',
                { name: 'color', icon: '🎨', title: 'Color de letra',
                  result: function() {
                      var sel = window.getSelection();
                      var savedRange = sel.rangeCount > 0 ? sel.getRangeAt(0).cloneRange() : null;
                      var colors = ['#000000','#e53935','#1976d2','#388e3c','#f57c00','#6a1b9a','#795548'];
                      var html = '<div class="admin-color-picker">';
                      colors.forEach(function(c) { html += '<span class="admin-color-dot" style="background:'+c+'" data-color="'+c+'"></span>'; });
                      html += '</div>';
                      Swal.fire({ html: html, showConfirmButton: false, width: 280, didOpen: function() {
                          document.querySelectorAll('.admin-color-dot').forEach(function(dot) {
                              dot.addEventListener('mousedown', function(e) {
                                  e.preventDefault(); // No robar foco
                                  var color = this.getAttribute('data-color');
                                  Swal.close();
                                  setTimeout(function() {
                                      if (savedRange) { sel.removeAllRanges(); sel.addRange(savedRange); }
                                      document.execCommand('foreColor', false, color);
                                  }, 50);
                              });
                          });
                      }});
                  }
                },
                { name: 'fontSize', icon: 'T↕', title: 'Tamano de letra',
                  result: function() {
                      var sel = window.getSelection();
                      var savedRange = sel.rangeCount > 0 ? sel.getRangeAt(0).cloneRange() : null;
                      Swal.fire({
                          html: '<select id="pellFontSize" style="padding:8px;font-size:14px;"><option value="1">Pequeno</option><option value="3" selected>Normal</option><option value="5">Grande</option><option value="7">Muy grande</option></select>',
                          showConfirmButton: true, confirmButtonText: 'Aplicar', width: 250,
                          preConfirm: function() { return document.getElementById('pellFontSize').value; }
                      }).then(function(r) {
                          if (r.isConfirmed && r.value) {
                              if (savedRange) { sel.removeAllRanges(); sel.addRange(savedRange); }
                              document.execCommand('fontSize', false, r.value);
                          }
                      });
                  }
                }
            ]
        });
    }

    // Inicializar editores (script al final de página = DOM ya está listo)
    function _initEditors() {
        if (document.getElementById('adminTaskEditor') && !adminTaskPell) {
            adminTaskPell = _initPellEditor('adminTaskEditor', 'Descripcion de la tarea...');
            if (adminTaskPell) adminTaskPell.content.setAttribute('data-placeholder', 'Descripcion de la tarea...');
        }
        if (document.getElementById('adminCommentEditor') && !adminCommentPell) {
            adminCommentPell = _initPellEditor('adminCommentEditor', 'Escribir comentario...');
            if (adminCommentPell) adminCommentPell.content.setAttribute('data-placeholder', 'Escribir comentario de seguimiento...');
        }
    }
    // Intentar inmediatamente, si falla por timing intentar con DOMContentLoaded
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', _initEditors);
    } else {
        _initEditors();
    }

    function agregarTareaAdmin() {
        var html = adminTaskPell ? adminTaskPell.content.innerHTML.trim() : '';
        var text = adminTaskPell ? adminTaskPell.content.textContent.trim() : '';
        if (!text) { Swal.fire('Error', 'La descripcion de la tarea es requerida.', 'warning'); return; }
        var seccionVal = document.getElementById('adminTaskSeccion').value;
        var seccionId = seccionVal === 'otros' ? '' : seccionVal;
        _adminPost({
            accion: 'adminThreadTaskAdd', admin_thread_id: ADMIN_PROJECT_ID,
            content: text, content_html: html, seccion_id: seccionId,
            assignee: document.getElementById('adminTaskAssignee').value,
            plan_date: document.getElementById('adminTaskDate').value, sectok: ADMIN_SECTOK
        }).then(function(r) {
            if (r.status === 'success') location.reload();
            else Swal.fire('Error', r.mensaje || r.error || JSON.stringify(r), 'error');
        }).catch(function(e) { console.error('adminThreadTaskAdd', e); });
    }

    function toggleTareaAdmin(taskId) {
        _adminPost({ accion: 'adminThreadTaskToggle', task_id: taskId, sectok: ADMIN_SECTOK })
        .then(function(r) {
            if (r.status === 'success') location.reload();
            else Swal.fire('Error', r.mensaje || r.error || JSON.stringify(r), 'error');
        }).catch(function(e) { console.error('adminThreadTaskToggle', e); });
    }

    function eliminarTareaAdmin(taskId) {
        Swal.fire({ title: '¿Eliminar esta tarea?', icon: 'warning', showCancelButton: true, confirmButtonText: 'Eliminar', cancelButtonText: 'Cancelar' })
        .then(function(result) {
            if (!result.isConfirmed) return;
            _adminPost({ accion: 'adminThreadTaskDelete', task_id: taskId, sectok: ADMIN_SECTOK })
            .then(function(r) {
                if (r.status === 'success') location.reload();
                else Swal.fire('Error', r.mensaje || r.error || JSON.stringify(r), 'error');
            }).catch(function(e) { console.error('adminThreadTaskDelete', e); });
        });
    }

    function notificarTareaAdmin(taskId) {
        Swal.fire({ title: '¿Notificar a los participantes sobre esta tarea?', icon: 'question', showCancelButton: true, confirmButtonText: 'Enviar', cancelButtonText: 'Cancelar' })
        .then(function(result) {
            if (!result.isConfirmed) return;
            _adminPost({ accion: 'adminThreadTaskNotify', task_id: taskId, admin_thread_id: ADMIN_PROJECT_ID, sectok: ADMIN_SECTOK })
            .then(function(r) {
                if (r.status === 'success') Swal.fire('Enviado', r.mensaje, 'success');
                else Swal.fire('Error', r.mensaje || r.error || JSON.stringify(r), 'error');
            }).catch(function(e) { console.error('adminThreadTaskNotify', e); });
        });
    }

    function agregarComentarioAdmin(parentId) {
        var html = adminCommentPell ? adminCommentPell.content.innerHTML.trim() : '';
        var text = adminCommentPell ? adminCommentPell.content.textContent.trim() : '';
        if (!text) { Swal.fire('Error', 'El comentario no puede estar vacio.', 'warning'); return; }
        var params = { accion: 'adminThreadCommentAdd', admin_thread_id: ADMIN_PROJECT_ID, content: text, content_html: html, sectok: ADMIN_SECTOK };
        if (parentId) params.parent_id = parentId;
        _adminPost(params).then(function(r) {
            if (r.status === 'success') location.reload();
            else Swal.fire('Error', r.mensaje || r.error || JSON.stringify(r), 'error');
        }).catch(function(e) { console.error('adminThreadCommentAdd', e); });
    }

    function editarComentarioAdmin(commentId, btn) {
        var bodyEl = document.getElementById('comment-body-' + commentId);
        var currentHtml = bodyEl ? bodyEl.innerHTML : '';
        Swal.fire({
            title: 'Editar comentario',
            html: '<div id="pellEditComment"></div>',
            didOpen: function() {
                var editor = _initPellEditor('pellEditComment');
                if (editor) editor.content.innerHTML = currentHtml;
            },
            showCancelButton: true, confirmButtonText: 'Guardar', cancelButtonText: 'Cancelar', width: 600,
            preConfirm: function() {
                var editEl = document.querySelector('#pellEditComment .pell-content');
                var newHtml = editEl ? editEl.innerHTML.trim() : '';
                var newText = editEl ? editEl.textContent.trim() : '';
                if (!newText) { Swal.showValidationMessage('El comentario no puede estar vacio.'); return false; }
                return { html: newHtml, text: newText };
            }
        }).then(function(result) {
            if (!result.isConfirmed || !result.value) return;
            _adminPost({ accion: 'adminThreadCommentEdit', comment_id: commentId, admin_thread_id: ADMIN_PROJECT_ID, content: result.value.text, content_html: result.value.html, sectok: ADMIN_SECTOK })
            .then(function(r) {
                if (r.status === 'success') location.reload();
                else Swal.fire('Error', r.mensaje || r.error || JSON.stringify(r), 'error');
            }).catch(function(e) { console.error('adminThreadCommentEdit', e); });
        });
    }

    function responderComentarioAdmin(parentId) {
        Swal.fire({
            title: 'Responder',
            html: '<div id="pellReplyComment"></div>',
            didOpen: function() { _initPellEditor('pellReplyComment'); },
            showCancelButton: true, confirmButtonText: 'Responder', cancelButtonText: 'Cancelar', width: 600,
            preConfirm: function() {
                var replyEl = document.querySelector('#pellReplyComment .pell-content');
                var html = replyEl ? replyEl.innerHTML.trim() : '';
                var text = replyEl ? replyEl.textContent.trim() : '';
                if (!text) { Swal.showValidationMessage('La respuesta no puede estar vacia.'); return false; }
                return { html: html, text: text };
            }
        }).then(function(result) {
            if (!result.isConfirmed || !result.value) return;
            _adminPost({ accion: 'adminThreadCommentAdd', admin_thread_id: ADMIN_PROJECT_ID, content: result.value.text, content_html: result.value.html, parent_id: parentId, sectok: ADMIN_SECTOK })
            .then(function(r) {
                if (r.status === 'success') location.reload();
                else Swal.fire('Error', r.mensaje || r.error || JSON.stringify(r), 'error');
            }).catch(function(e) { console.error('adminThreadCommentReply', e); });
        });
    }

    function eliminarComentarioAdmin(commentId) {
        Swal.fire({ title: '¿Eliminar este comentario?', icon: 'warning', showCancelButton: true, confirmButtonText: 'Eliminar', cancelButtonText: 'Cancelar' })
        .then(function(result) {
            if (!result.isConfirmed) return;
            _adminPost({ accion: 'adminThreadCommentDelete', comment_id: commentId, sectok: ADMIN_SECTOK })
            .then(function(r) {
                if (r.status === 'success') location.reload();
                else Swal.fire('Error', r.mensaje || r.error || JSON.stringify(r), 'error');
            }).catch(function(e) { console.error('adminThreadCommentDelete', e); });
        });
    }

    function agregarParticipanteAdmin() {
        var userId = document.getElementById('adminParticipantUser').value;
        if (!userId) { Swal.fire('Error', 'Seleccione un usuario.', 'warning'); return; }
        _adminPost({ accion: 'adminThreadParticipantAdd', admin_thread_id: ADMIN_PROJECT_ID, user_id: userId, sectok: ADMIN_SECTOK })
        .then(function(r) {
            if (r.status === 'success') location.reload();
            else Swal.fire('Error', r.mensaje || r.error || JSON.stringify(r), 'error');
        }).catch(function(e) { console.error('adminThreadParticipantAdd', e); });
    }

    function removerParticipanteAdmin(participantId) {
        Swal.fire({ title: '¿Remover este participante?', icon: 'warning', showCancelButton: true, confirmButtonText: 'Remover', cancelButtonText: 'Cancelar' })
        .then(function(result) {
            if (!result.isConfirmed) return;
            _adminPost({ accion: 'adminThreadParticipantRemove', participant_id: participantId, sectok: ADMIN_SECTOK })
            .then(function(r) {
                if (r.status === 'success') location.reload();
                else Swal.fire('Error', r.mensaje || r.error || JSON.stringify(r), 'error');
            }).catch(function(e) { console.error('adminThreadParticipantRemove', e); });
        });
    }
</script>
