<?php
// modules/coordinador/gestor_academico.php — CES/CACES v2
// Bandeja del Gestor Académico: gestiona solicitudes de todas las modalidades.
// Equivalente al "Gestor Académico" del Manual UG, sección 1-5.
require_once __DIR__ . '/../../config/app.php';
require_once __DIR__ . '/../../includes/auth.php';
require_once __DIR__ . '/../../includes/functions.php';
require_once __DIR__ . '/../../includes/flash.php';
requireRol(ROL_COORDINADOR);

$user      = currentUser();
$db        = getDB();
$pageTitle = 'Gestor Académico — Prácticas Pre Profesionales';

// ── Filtros ────────────────────────────────────────────────────────
$filtroModal  = $_GET['modalidad'] ?? '';
$filtroEstado = $_GET['estado']    ?? 'postulado';
$filtroEstGes = $_GET['estado_gestor'] ?? '';
$busq         = trim($_GET['q'] ?? '');

$valModalidades = ['','practicas_laborales','validacion_horas','homologacion','extracurriculares','consejo_judicatura'];
$valEstados     = ['','postulado','aprobado','en_progreso','calificado','completado','rechazado'];
if (!in_array($filtroModal, $valModalidades, true))  $filtroModal  = '';
if (!in_array($filtroEstado, $valEstados, true))     $filtroEstado = 'postulado';

$where  = ['1=1'];
$params = [];
if ($filtroModal)  { $where[] = 'pr.tipo_modalidad = :modal'; $params[':modal'] = $filtroModal; }
if ($filtroEstado) { $where[] = 'pr.estado = :est';           $params[':est']  = $filtroEstado; }
if ($filtroEstGes) { $where[] = 'pr.estado_gestor = :estg';   $params[':estg'] = $filtroEstGes; }
if ($busq)         { $where[] = "(CONCAT(uu.nombres,' ',uu.apellidos) LIKE :q OR uu.cedula LIKE :q2)";
                     $params[':q']  = "%$busq%"; $params[':q2'] = "%$busq%"; }

$sql = "SELECT pr.id_practica, pr.estado, pr.estado_gestor, pr.tipo_modalidad,
               pr.horas_requeridas, pr.horas_cumplidas, pr.fecha_inicio, pr.fecha_fin,
               pr.observacion_gestor, pr.created_at,
               CONCAT(uu.nombres,' ',uu.apellidos) AS estudiante, uu.cedula,
               em.razon_social AS empresa, pe.nombre AS periodo,
               c.nombre AS carrera
        FROM   practicas pr
        JOIN   estudiantes e  ON e.id_estudiante = pr.id_estudiante
        JOIN   usuarios uu    ON uu.id_usuario   = e.id_usuario
        JOIN   carreras c     ON c.id_carrera    = e.id_carrera
        JOIN   empresas em    ON em.id_empresa   = pr.id_empresa
        JOIN   periodos_academicos pe ON pe.id_periodo = pr.id_periodo
        WHERE  " . implode(' AND ', $where) . "
        ORDER  BY pr.created_at DESC LIMIT 200";

$st = $db->prepare($sql);
$st->execute($params);
$solicitudes = $st->fetchAll();

// ── Etiquetas de modalidad ─────────────────────────────────────────
$MODAL_LABELS = [
    'practicas_laborales' => ['Prácticas Laborales',             '#2ea8ff'],
    'validacion_horas'    => ['Validación Horas Trabajadas',     '#ffb74d'],
    'homologacion'        => ['Homologación',                    '#ab47bc'],
    'extracurriculares'   => ['Actividades Extracurriculares',   '#66bb6a'],
    'consejo_judicatura'  => ['Prácticas Judicatura',            '#ef5350'],
];

// ── Helper: documentos de una práctica ────────────────────────────
function getDocsDeRactica(PDO $db, int $idPrac): array {
    try {
        $st = $db->prepare("SELECT ds.*,td.nombre AS tipo_nombre,td.obligatorio FROM documentos_solicitud ds JOIN tipos_documento td ON td.id_tipo=ds.id_tipo WHERE ds.id_practica=:p ORDER BY td.obligatorio DESC");
        $st->execute([':p'=>$idPrac]);
        return $st->fetchAll();
    } catch(Exception $e){ return []; }
}

// ── Acción POST: Gestionar solicitud ──────────────────────────────
if ($_SERVER['REQUEST_METHOD']==='POST') {
    $accion     = $_POST['accion']      ?? '';
    $idPrac     = (int)($_POST['id_practica'] ?? 0);
    $obs        = trim($_POST['observacion']  ?? '');
    $motivoRec  = trim($_POST['motivo_rechazo'] ?? '');

    if ($idPrac && in_array($accion, ['revisar','devolver','rechazar_gestor','aprobar','procesar'])) {

        if ($accion === 'revisar') {
            // Marcar como revisada (sin cambiar estado principal)
            $db->prepare("UPDATE practicas SET estado_gestor='revisada', observacion_gestor=:o, fecha_aprobacion_gestor=CURDATE() WHERE id_practica=:id")
               ->execute([':o'=>$obs,':id'=>$idPrac]);
            flashSet('ok','Solicitud marcada como revisada.');

        } elseif ($accion === 'devolver') {
            // Devolver al estudiante para correcciones
            if (!$obs) { flashSet('err','Debes ingresar el motivo de devolución.'); }
            else {
                $db->prepare("UPDATE practicas SET estado_gestor='devuelta', estado='postulado', observacion_gestor=:o WHERE id_practica=:id")
                   ->execute([':o'=>$obs,':id'=>$idPrac]);
                flashSet('warn','Solicitud devuelta al estudiante para correcciones.');
            }

        } elseif ($accion === 'rechazar_gestor') {
            if (!$motivoRec) { flashSet('err','Debes ingresar el motivo de rechazo.'); }
            else {
                $db->prepare("UPDATE practicas SET estado_gestor='rechazada_gestor', estado='rechazado', motivo_rechazo=:m, observacion_gestor=:o WHERE id_practica=:id")
                   ->execute([':m'=>$motivoRec,':o'=>$obs,':id'=>$idPrac]);
                flashSet('ok','Solicitud rechazada.');
            }

        } elseif ($accion === 'aprobar') {
            // Aprobar la solicitud → pasa a estado aprobado
            $db->prepare("UPDATE practicas SET estado_gestor='aprobada_gestor', estado='aprobado', observacion_gestor=:o, fecha_aprobacion_gestor=CURDATE() WHERE id_practica=:id")
               ->execute([':o'=>$obs,':id'=>$idPrac]);
            // Actualizar documentos: marcar cumple según checkboxes
            foreach ($_POST as $k => $v) {
                if (preg_match('/^cumple_(\d+)$/', $k, $m)) {
                    $db->prepare("UPDATE documentos_solicitud SET cumple=1 WHERE id_documento=:id")
                       ->execute([':id'=>(int)$m[1]]);
                }
            }
            flashSet('ok','Solicitud aprobada exitosamente.');

        } elseif ($accion === 'procesar') {
            // Asignar tutor/supervisor/fechas (Prácticas Laborales)
            $idTutor = (int)($_POST['id_tutor']??0);
            $fIni    = $_POST['fecha_inicio'] ?? '';
            $fFin    = $_POST['fecha_fin']    ?? '';
            $horas   = (int)($_POST['horas_requeridas']??400);
            $fields  = ['estado'=>'aprobado','estado_gestor'=>'aprobada_gestor','observacion_gestor'=>$obs,'fecha_aprobacion_gestor'=>date('Y-m-d')];
            if ($idTutor) $fields['id_tutor'] = $idTutor;
            if ($fIni)    $fields['fecha_inicio'] = $fIni;
            if ($fFin)    $fields['fecha_fin']    = $fFin;
            if ($horas)   $fields['horas_requeridas'] = $horas;
            $set = implode(',', array_map(fn($k)=>"$k=:$k", array_keys($fields)));
            $p   = array_combine(array_map(fn($k)=>":$k",array_keys($fields)), $fields);
            $p[':id'] = $idPrac;
            $db->prepare("UPDATE practicas SET $set WHERE id_practica=:id")->execute($p);
            flashSet('ok','Solicitud procesada y aprobada.');
        }

        registrarAudit($user['id'], 'gestor_'.$accion, 'practicas', $idPrac);
        header('Location: gestor_academico.php?' . http_build_query(['modalidad'=>$filtroModal,'estado'=>$filtroEstado])); exit;
    }
}

// ── Tutores disponibles (para Prácticas Laborales) ────────────────
$tutores = $db->query("SELECT t.id_tutor, CONCAT(u.nombres,' ',u.apellidos) AS nombre FROM tutores t JOIN usuarios u ON u.id_usuario=t.id_usuario WHERE u.activo=1 ORDER BY u.apellidos")->fetchAll();
?>
<?php $paginaActual = 'dashboard'; ?>
<!DOCTYPE html><html lang="es"><head>
<?php include __DIR__.'/../../includes/head.php'; ?>
<style>
.modal-badge{display:inline-block;padding:2px 10px;border-radius:20px;font-size:.72rem;font-weight:600;}
.filter-bar{display:flex;gap:.5rem;flex-wrap:wrap;margin-bottom:1rem;align-items:center;}
.filter-bar select,.filter-bar input{background:#161b22;border:1px solid #30363d;color:#e6edf3;border-radius:6px;padding:.3rem .6rem;font-size:.83rem;}
.filter-bar select:focus,.filter-bar input:focus{outline:2px solid #2ea8ff;}
.doc-row-g{display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;background:#161b22;border:1px solid #30363d;border-radius:6px;margin-bottom:.4rem;flex-wrap:wrap;}
.doc-row-g .dl{flex:1;font-size:.84rem;min-width:180px;}
.stats-bar{display:flex;gap:1rem;margin-bottom:1.25rem;flex-wrap:wrap;}
.stat-box{background:#161b22;border:1px solid #30363d;border-radius:8px;padding:.75rem 1.25rem;min-width:110px;text-align:center;}
.stat-box .sv{font-size:1.5rem;font-weight:700;color:#2ea8ff;}
.stat-box .sl{font-size:.72rem;color:#8b949e;}
</style>
</head><body>
<?php include __DIR__.'/../../includes/navbar.php'; ?>
<div class="app-shell">
  <?php include __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'sidebar-coordinador.php'; ?>
  <main class="main-area">
    <div class="page-header d-flex justify-content-between align-items-center">
      <div><h4>Gestión de Solicitudes — Prácticas Pre Profesionales</h4>
           <p>Procesa, aprueba, devuelve o rechaza solicitudes de todas las modalidades CES.</p></div>
    </div>
    <?=flashHtml()?>

    <!-- Estadísticas rápidas -->
    <?php
    $statsQ = $db->query("SELECT estado_gestor, COUNT(*) AS n FROM practicas GROUP BY estado_gestor");
    $stats  = []; foreach($statsQ->fetchAll() as $r) $stats[$r['estado_gestor']]=$r['n'];
    ?>
    <div class="stats-bar">
      <div class="stat-box"><div class="sv"><?=array_sum($stats)?></div><div class="sl">Total solicitudes</div></div>
      <div class="stat-box"><div class="sv" style="color:#ffb74d;"><?=$stats['pendiente']??0?></div><div class="sl">Pendientes</div></div>
      <div class="stat-box"><div class="sv" style="color:#4caf50;"><?=$stats['aprobada_gestor']??0?></div><div class="sl">Aprobadas</div></div>
      <div class="stat-box"><div class="sv" style="color:#ef5350;"><?=$stats['rechazada_gestor']??0?></div><div class="sl">Rechazadas</div></div>
      <div class="stat-box"><div class="sv" style="color:#ab47bc;"><?=$stats['devuelta']??0?></div><div class="sl">Devueltas</div></div>
    </div>

    <!-- Filtros -->
    <form method="GET" class="filter-bar mb-3">
      <select name="modalidad">
        <option value="">Todas las modalidades</option>
        <?php foreach($MODAL_LABELS as $k=>[$lbl,$color]): ?>
        <option value="<?=$k?>" <?=$filtroModal===$k?'selected':''?>><?=htmlspecialchars($lbl)?></option>
        <?php endforeach; ?>
      </select>
      <select name="estado">
        <?php foreach(['postulado'=>'Postulado','aprobado'=>'Aprobado','en_progreso'=>'En progreso','calificado'=>'Calificado','completado'=>'Completado','rechazado'=>'Rechazado',''=>'Todos'] as $v=>$l): ?>
        <option value="<?=$v?>" <?=$filtroEstado===$v?'selected':''?>><?=htmlspecialchars($l)?></option>
        <?php endforeach; ?>
      </select>
      <input type="text" name="q" value="<?=htmlspecialchars($busq)?>" placeholder="Buscar por nombre o cédula…" style="min-width:200px;">
      <button type="submit" class="btn btn-sm btn-primary"><i class="fa fa-search me-1"></i>Buscar</button>
      <a href="gestor_academico.php" class="btn btn-sm btn-outline-secondary">Limpiar</a>
    </form>

    <!-- Tabla de solicitudes -->
    <div class="tbl-wrap">
      <table class="table table-borderless mb-0">
        <thead>
          <tr>
            <th>#</th><th>Estudiante</th><th>Carrera</th>
            <th>Modalidad</th><th>Empresa</th><th>Período</th>
            <th>Horas</th><th>Estado</th><th>Gestor</th><th>Acciones</th>
          </tr>
        </thead>
        <tbody>
        <?php if(empty($solicitudes)): ?>
        <tr><td colspan="10" class="text-center text-muted py-4">No hay solicitudes con estos filtros.</td></tr>
        <?php else: foreach($solicitudes as $s):
            [$mLabel,$mColor] = $MODAL_LABELS[$s['tipo_modalidad']] ?? ['—','#888'];
        ?>
        <tr>
          <td style="font-size:11px;color:#8b949e;"><?=$s['id_practica']?></td>
          <td>
            <div style="font-weight:600;font-size:13px;"><?=htmlspecialchars($s['estudiante'])?></div>
            <div style="font-size:11px;color:#8b949e;"><?=htmlspecialchars($s['cedula'])?></div>
          </td>
          <td style="font-size:12px;"><?=htmlspecialchars($s['carrera'])?></td>
          <td>
            <span class="modal-badge" style="background:<?=$mColor?>22;color:<?=$mColor?>;">
              <?=htmlspecialchars($mLabel)?>
            </span>
          </td>
          <td style="font-size:12px;"><?=htmlspecialchars($s['empresa'])?></td>
          <td style="font-size:12px;"><?=htmlspecialchars($s['periodo'])?></td>
          <td style="font-size:12px;"><?=$s['horas_cumplidas']?>/<?=$s['horas_requeridas']?>h</td>
          <td><?=badgeEstado($s['estado'])?></td>
          <td>
            <?php
            $gestorCls=['pendiente'=>'#8b949e','revisada'=>'#2ea8ff','devuelta'=>'#ffb74d','rechazada_gestor'=>'#e57373','aprobada_gestor'=>'#4caf50'];
            $gc=$gestorCls[$s['estado_gestor']??'pendiente']??'#8b949e';
            ?>
            <span style="font-size:.75rem;color:<?=$gc?>;font-weight:600;"><?=ucfirst(str_replace('_',' ',$s['estado_gestor']??'pendiente'))?></span>
          </td>
          <td>
            <button class="btn btn-sm btn-primary btn-gestionar"
                    data-id="<?=$s['id_practica']?>"
                    data-modalidad="<?=$s['tipo_modalidad']?>"
                    data-estudiante="<?=htmlspecialchars($s['estudiante'])?>"
                    data-empresa="<?=htmlspecialchars($s['empresa'])?>">
              <i class="fa fa-pen-to-square me-1"></i>Procesar
            </button>
          </td>
        </tr>
        <?php endforeach; endif; ?>
        </tbody>
      </table>
    </div>
    <div style="font-size:.76rem;color:#8b949e;margin-top:.5rem;">
      <?=count($solicitudes)?> solicitud(es) encontradas
    </div>
  </main>
</div>

<!-- ════════════ MODAL PROCESAR ════════════════════════════════════ -->
<div class="modal fade" id="modalGestionar" tabindex="-1">
  <div class="modal-dialog modal-lg"><div class="modal-content">
    <div class="modal-header">
      <h5 class="modal-title"><i class="fa fa-clipboard-check me-2" style="color:#2ea8ff;"></i>Procesar Solicitud</h5>
      <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal"></button>
    </div>
    <form method="POST" id="formGestor">
      <input type="hidden" name="id_practica" id="g_id">
      <input type="hidden" name="accion"      id="g_accion" value="aprobar">
      <div class="modal-body">
        <div class="mb-3 p-3" style="background:#161b22;border-radius:8px;border:1px solid #30363d;">
          <div style="font-size:.78rem;color:#8b949e;">ESTUDIANTE</div>
          <div id="g_nombre" style="font-weight:600;"></div>
          <div id="g_empresa" style="font-size:.83rem;color:#8b949e;"></div>
          <div id="g_badge_modal" class="mt-1"></div>
        </div>

        <!-- Docs adjuntos -->
        <div id="g_docs_section" style="display:none;" class="mb-3">
          <div class="fw-bold mb-2" style="font-size:.88rem;"><i class="fa fa-paperclip me-2"></i>Documentos adjuntos</div>
          <div id="g_docs_lista"></div>
        </div>

        <!-- Campos extra para Prácticas Laborales -->
        <div id="g_campos_laborales" style="display:none;" class="mb-3">
          <div class="row g-2">
            <div class="col-sm-6">
              <label class="form-label" style="font-size:.82rem;">Tutor académico</label>
              <select name="id_tutor" class="form-select form-select-sm">
                <option value="">— sin asignar —</option>
                <?php foreach($tutores as $t): ?>
                <option value="<?=$t['id_tutor']?>"><?=htmlspecialchars($t['nombre'])?></option>
                <?php endforeach; ?>
              </select>
            </div>
            <div class="col-sm-3">
              <label class="form-label" style="font-size:.82rem;">Fecha inicio</label>
              <input type="date" name="fecha_inicio" class="form-control form-control-sm">
            </div>
            <div class="col-sm-3">
              <label class="form-label" style="font-size:.82rem;">Fecha fin</label>
              <input type="date" name="fecha_fin" class="form-control form-control-sm">
            </div>
            <div class="col-sm-4">
              <label class="form-label" style="font-size:.82rem;">Horas asignadas</label>
              <input type="number" name="horas_requeridas" class="form-control form-control-sm" value="400" min="1">
            </div>
          </div>
        </div>

        <div class="mb-3">
          <label class="form-label" style="font-size:.82rem;">Observación / Nota del gestor</label>
          <textarea name="observacion" id="g_obs" class="form-control" rows="3" placeholder="Escribe aquí cualquier observación importante…"></textarea>
        </div>
        <div id="g_motivo_rechazo_wrap" style="display:none;" class="mb-2">
          <label class="form-label" style="font-size:.82rem;color:#e57373;">Motivo de rechazo <span style="color:#e57373;">*</span></label>
          <textarea name="motivo_rechazo" id="g_motivo" class="form-control" rows="2"></textarea>
        </div>
      </div>
      <div class="modal-footer gap-2">
        <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Cancelar</button>
        <button type="button" class="btn btn-warning"  id="btnDevolver"><i class="fa fa-rotate-left me-1"></i>Devolver</button>
        <button type="button" class="btn btn-danger"   id="btnRechazar"><i class="fa fa-xmark me-1"></i>Rechazar</button>
        <button type="button" class="btn btn-success"  id="btnAprobar"><i class="fa fa-check me-1"></i>Aprobar</button>
      </div>
    </form>
  </div></div>
</div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.bundle.min.js"></script>
<script>
const MODAL_LABELS = <?=json_encode(array_map(fn($v)=>$v[0],$MODAL_LABELS),JSON_UNESCAPED_UNICODE)?>;
const BASE = '<?=BASE_URL?>';

// Cargar docs vía fetch al abrir modal
document.querySelectorAll('.btn-gestionar').forEach(btn=>{
    btn.addEventListener('click', async function(){
        const id       = this.dataset.id;
        const modal    = this.dataset.modalidad;
        const nombre   = this.dataset.estudiante;
        const empresa  = this.dataset.empresa;

        document.getElementById('g_id').value     = id;
        document.getElementById('g_nombre').textContent  = nombre;
        document.getElementById('g_empresa').textContent = empresa;
        document.getElementById('g_badge_modal').innerHTML =
            `<span style="font-size:.74rem;font-weight:600;color:#2ea8ff;">${MODAL_LABELS[modal]||modal}</span>`;
        document.getElementById('g_obs').value   = '';
        document.getElementById('g_motivo').value= '';
        document.getElementById('g_motivo_rechazo_wrap').style.display='none';

        // Mostrar campos laborales solo para prácticas_laborales
        document.getElementById('g_campos_laborales').style.display =
            modal==='practicas_laborales' ? 'block' : 'none';

        // Cargar documentos
        try {
            const r   = await fetch(`${BASE}/api/coordinador/docs_solicitud.php?id=${id}`);
            const data= await r.json();
            const sec = document.getElementById('g_docs_section');
            const lst = document.getElementById('g_docs_lista');
            if(data.docs && data.docs.length){
                sec.style.display='block';
                lst.innerHTML = data.docs.map(d=>`
                    <div class="doc-row-g">
                        <div class="dl">${esc(d.tipo_nombre)}
                            ${d.obligatorio==1?'<span style="font-size:.68rem;color:#e57373;margin-left:.3rem;">Obligatorio</span>':''}
                        </div>
                        ${d.cumple===null
                            ? '<span style="font-size:.72rem;color:#8b949e;">Sin revisar</span>'
                            : d.cumple==1
                                ? '<span style="font-size:.72rem;color:#4caf50;">✓ Cumple</span>'
                                : '<span style="font-size:.72rem;color:#e57373;">✗ No cumple</span>'}
                        <label style="display:flex;align-items:center;gap:.3rem;font-size:.78rem;cursor:pointer;">
                            <input type="checkbox" name="cumple_${d.id_documento}" value="1" ${d.cumple==1?'checked':''}>
                            Cumple
                        </label>
                        <a href="${BASE}/${esc(d.ruta_archivo)}" target="_blank"
                           class="btn btn-sm btn-outline-secondary" style="padding:2px 8px;">
                            <i class="fa fa-download"></i>
                        </a>
                    </div>`).join('');
            } else { sec.style.display='none'; }
        } catch(e){ document.getElementById('g_docs_section').style.display='none'; }

        new bootstrap.Modal(document.getElementById('modalGestionar')).show();
    });
});

// Botones acción
document.getElementById('btnAprobar').addEventListener('click',()=>{
    if(confirm('¿Aprobar esta solicitud?')){
        document.getElementById('g_accion').value = 
            document.getElementById('g_campos_laborales').style.display!=='none'?'procesar':'aprobar';
        document.getElementById('formGestor').submit();
    }
});
document.getElementById('btnDevolver').addEventListener('click',()=>{
    const obs=document.getElementById('g_obs').value.trim();
    if(!obs){alert('Debes escribir el motivo de devolución en el campo Observación.');return;}
    if(confirm('¿Devolver esta solicitud al estudiante?')){
        document.getElementById('g_accion').value='devolver';
        document.getElementById('formGestor').submit();
    }
});
document.getElementById('btnRechazar').addEventListener('click',()=>{
    document.getElementById('g_motivo_rechazo_wrap').style.display='block';
    const motivo=document.getElementById('g_motivo').value.trim();
    if(!motivo){document.getElementById('g_motivo').focus();return;}
    if(confirm('¿RECHAZAR esta solicitud? El estudiante deberá crear una nueva.')){{
        document.getElementById('g_accion').value='rechazar_gestor';
        document.getElementById('formGestor').submit();
    }}
});

function esc(s){const d=document.createElement('div');d.textContent=s;return d.innerHTML;}
</script>
</body></html>