<?php
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 = 'Prácticas';
$idInst = (int)($user['id_instituto'] ?? 0);

// ── Obtener id_coordinador del usuario logueado ──────────────────────────────
$stCoord = $db->prepare("SELECT id_coordinador FROM coordinadores WHERE id_usuario = :u LIMIT 1");
$stCoord->execute([':u' => $user['id']]);
$coordRow  = $stCoord->fetch();
$idCoord   = $coordRow ? (int)$coordRow['id_coordinador'] : 0;

// ── Carreras asignadas a ESTE coordinador ────────────────────────────────────
// Si tiene carreras asignadas en coordinador_carrera, solo ve esas.
// Si no tiene ninguna asignada, ve todas las de su instituto.
$carrerasAsignadas = [];
if ($idCoord) {
    try {
        $stCC = $db->prepare("SELECT id_carrera FROM coordinador_carrera WHERE id_coordinador = :c");
        $stCC->execute([':c' => $idCoord]);
        $carrerasAsignadas = array_column($stCC->fetchAll(), 'id_carrera');
    } catch (Exception $e) { $carrerasAsignadas = []; }
}

// ── POST: cambiar estado ─────────────────────────────────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $id    = (int)($_POST['id_practica'] ?? 0);
    $nuevo = in_array($_POST['estado'] ?? '', ['aprobado','rechazado','en_progreso','calificado','completado'])
             ? $_POST['estado'] : null;
    $obs    = trim($_POST['observaciones'] ?? '');
    $motivo = trim($_POST['motivo_rechazo'] ?? '');
    if ($id && $nuevo) {
        $instCond  = $idInst ? " AND car.id_instituto=:inst" : '';
        $coordCond = !empty($carrerasAsignadas)
            ? " AND est.id_carrera IN (" . implode(',', array_map('intval', $carrerasAsignadas)) . ")"
            : '';
        $params = [':e'=>$nuevo, ':o'=>$obs, ':m'=>$motivo, ':id'=>$id];
        if ($idInst) $params[':inst'] = $idInst;
        $db->prepare("UPDATE practicas pr
            JOIN estudiantes est ON est.id_estudiante = pr.id_estudiante
            JOIN carreras car ON car.id_carrera = est.id_carrera
            SET pr.estado=:e, pr.observaciones=:o, pr.motivo_rechazo=:m
            WHERE pr.id_practica=:id{$instCond}{$coordCond}")
           ->execute($params);
        registrarAudit($user['id'], 'cambio_estado_practica', 'practicas', $id);
        flashSet('ok', 'Estado actualizado a: ' . $nuevo);
    }
    // Redirigir conservando filtros
    $qs = http_build_query(array_filter([
        'estado'   => $_POST['filtro_estado'] ?? '',
        'carrera'  => $_POST['filtro_carrera'] ?? '',
        'periodo'  => $_POST['filtro_periodo'] ?? '',
        'buscar'   => $_POST['filtro_buscar'] ?? '',
    ]));
    header('Location: practicas.php' . ($qs ? '?' . $qs : '')); exit;
}

// ── Filtros ──────────────────────────────────────────────────────────────────
$filtroEstado  = trim($_GET['estado']  ?? '');
$filtroCarrera = (int)($_GET['carrera'] ?? 0);
$filtroPeriodo = (int)($_GET['periodo'] ?? 0);
$filtroBuscar  = trim($_GET['buscar']  ?? '');
$pagina        = max(1, (int)($_GET['pagina'] ?? 1));
$porPagina     = 20;
$offset        = ($pagina - 1) * $porPagina;

// ── Catálogos para filtros (solo carreras asignadas al coordinador) ───────────
if (!empty($carrerasAsignadas)) {
    $inCar = implode(',', array_map('intval', $carrerasAsignadas));
    $stCar = $db->prepare("SELECT id_carrera, nombre FROM carreras WHERE activa=1 AND id_carrera IN ($inCar) ORDER BY nombre");
    $stCar->execute();
} else {
    $stCar = $db->prepare("SELECT id_carrera, nombre FROM carreras WHERE activa=1" . ($idInst ? " AND id_instituto=:inst" : "") . " ORDER BY nombre");
    if ($idInst) $stCar->bindValue(':inst', $idInst);
    $stCar->execute();
}
$carreras = $stCar->fetchAll();

$stPer = $db->prepare("SELECT DISTINCT pa.id_periodo, pa.nombre
    FROM periodos_academicos pa
    JOIN practicas pr ON pr.id_periodo = pa.id_periodo
    JOIN estudiantes est ON est.id_estudiante = pr.id_estudiante
    JOIN carreras car ON car.id_carrera = est.id_carrera
    WHERE 1=1" . ($idInst ? " AND car.id_instituto=:inst" : "") . "
    ORDER BY pa.fecha_inicio DESC LIMIT 20");
if ($idInst) $stPer->bindValue(':inst', $idInst);
$stPer->execute();
$periodos = $stPer->fetchAll();

// ── Construcción dinámica del WHERE ─────────────────────────────────────────
$conds  = [];
$params = [];

if ($filtroEstado)  { $conds[] = "pr.estado = :est";       $params[':est']  = $filtroEstado; }
if ($filtroCarrera) { $conds[] = "est.id_carrera = :car";  $params[':car']  = $filtroCarrera; }
if ($filtroPeriodo) { $conds[] = "pr.id_periodo = :per";   $params[':per']  = $filtroPeriodo; }
if ($filtroBuscar)  {
    $conds[]          = "(CONCAT(uu.nombres,' ',uu.apellidos) LIKE :bus OR em.razon_social LIKE :bus2)";
    $params[':bus']   = '%' . $filtroBuscar . '%';
    $params[':bus2']  = '%' . $filtroBuscar . '%';
}
// Filtro obligatorio por instituto
if ($idInst) {
    $conds[]        = "car.id_instituto = :inst";
    $params[':inst'] = $idInst;
}
// Filtro por carreras asignadas al coordinador (dentro del instituto)
if (!empty($carrerasAsignadas)) {
    $inPlaceholders = implode(',', array_map('intval', $carrerasAsignadas));
    $conds[] = "est.id_carrera IN ($inPlaceholders)";
}
$where = $conds ? 'WHERE ' . implode(' AND ', $conds) : '';

// ── SQL base ─────────────────────────────────────────────────────────────────
$sqlBase = "
    FROM   practicas pr
    JOIN   estudiantes est ON est.id_estudiante = pr.id_estudiante
    JOIN   usuarios uu     ON uu.id_usuario     = est.id_usuario
    JOIN   carreras car    ON car.id_carrera     = est.id_carrera
    JOIN   empresas em     ON em.id_empresa      = pr.id_empresa
    JOIN   periodos_academicos pe ON pe.id_periodo = pr.id_periodo
    LEFT JOIN tutores tt        ON tt.id_tutor   = pr.id_tutor
    LEFT JOIN usuarios ut       ON ut.id_usuario  = tt.id_usuario
    LEFT JOIN informes_finales inf ON inf.id_practica = pr.id_practica
    $where
";

// Total para paginación
$stTotal = $db->prepare("SELECT COUNT(*) $sqlBase");
$stTotal->execute($params);
$totalRegistros = (int)$stTotal->fetchColumn();
$totalPaginas   = max(1, (int)ceil($totalRegistros / $porPagina));
$pagina         = min($pagina, $totalPaginas);

// Query principal
$sqlSelect = "
    SELECT pr.id_practica, pr.estado,
           pr.horas_cumplidas, pr.horas_requeridas,
           pr.fecha_inicio, pr.fecha_fin,
           pr.nota_final,
           pr.nota_tutor_academico,
           pr.nota_tutor_empresa,
           pr.nota_empresa_100,
           pr.nota_bitacoras,
           pr.nota_informe,
           pr.fecha_calificacion,
           CONCAT(uu.nombres,' ',uu.apellidos) AS estudiante,
           uu.cedula,
           car.nombre AS carrera,
           em.razon_social AS empresa,
           pe.nombre AS periodo,
           CONCAT(ut.nombres,' ',ut.apellidos) AS tutor,
           inf.archivo_pdf       AS inf_pdf,
           inf.estado_coordinador AS inf_estado_coord
    $sqlBase
    ORDER BY pr.created_at DESC
    LIMIT :lim OFFSET :off
";
$stP = $db->prepare($sqlSelect);
foreach ($params as $k => $v) $stP->bindValue($k, $v);
$stP->bindValue(':lim', $porPagina, PDO::PARAM_INT);
$stP->bindValue(':off', $offset,    PDO::PARAM_INT);
$stP->execute();
$practicas = $stP->fetchAll();

// ── Helper nota ──────────────────────────────────────────────────────────────
function notaBadge($nota) {
    if ($nota === null || $nota === '') return '<span style="font-size:11px;color:#8b949e">Sin nota</span>';
    $n = (float)$nota;
    if ($n >= 90) $color = '#16a34a';
    elseif ($n >= 70) $color = '#d97706';
    else $color = '#dc2626';
    $label = $n >= 90 ? 'Excelente' : ($n >= 70 ? 'Aprobado' : 'Reprobado');
    return '<span style="font-size:14px;font-weight:800;color:'.$color.'">' . number_format($n, 2) . '</span>'
         . '<span style="font-size:9px;display:block;color:'.$color.';font-weight:600;text-transform:uppercase;letter-spacing:.4px">' . $label . '</span>';
}

// ── Helper: URL correcta del PDF del informe final ───────────────────────────
// Ruta BD local:    "informes/informe_9_1777441916.pdf"
// Ruta BD OneDrive: "onedrive:informes/14/informe_14_1778095820.pdf"
// En ambos casos el endpoint ver_informe_coord.php maneja la diferencia.
function getPdfUrl(int $idPractica): string {
    return BASE_URL . '/api/ver_informe_coord.php?practica=' . $idPractica;
}

// Helper construir URL con filtros
function urlFiltro($extra = []) {
    $base = array_filter([
        'estado'  => $_GET['estado']  ?? '',
        'carrera' => $_GET['carrera'] ?? '',
        'periodo' => $_GET['periodo'] ?? '',
        'buscar'  => $_GET['buscar']  ?? '',
        'pagina'  => $_GET['pagina']  ?? '',
    ]);
    $merged = array_filter(array_merge($base, $extra), fn($v) => $v !== '' && $v !== '0' && $v !== 0);
    return 'practicas.php' . ($merged ? '?' . http_build_query($merged) : '');
}
?>
<?php $paginaActual = 'practicas'; ?>
<!DOCTYPE html>
<html lang="es">
<head>
<?php include __DIR__ . '/../../includes/head.php'; ?>
<link rel="stylesheet" href="<?= BASE_URL ?>/assets/css/sidebar.css">
<link rel="stylesheet" href="<?= BASE_URL ?>/assets/css/sidebar-coordinador.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.1.0-rc.0/css/select2.min.css">
<style>
/* ── Select2 integrado ── */
.select2-container--default .select2-selection--single{height:31px;border:1px solid #e2e8f0;border-radius:6px;background:#fff;font-size:13px}
.select2-container--default .select2-selection--single .select2-selection__rendered{line-height:29px;padding-left:10px;color:#1e293b;font-size:13px}
.select2-container--default .select2-selection--single .select2-selection__arrow{height:29px;right:6px}
.select2-container--default.select2-container--open .select2-selection--single{border-color:#3b82f6;box-shadow:0 0 0 3px rgba(59,130,246,.12)}
.select2-dropdown{border:1px solid #e2e8f0;border-radius:8px;box-shadow:0 4px 16px rgba(0,0,0,.08);font-size:13px}
.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #e2e8f0;border-radius:6px;padding:5px 10px;font-size:12px}
.select2-container--default .select2-results__option--highlighted{background:#3b82f6}
.select2-container--default .select2-results__option{padding:7px 12px}
.select2-container{width:100%!important}
/* ── Tarjeta nota ── */
.nota-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:8px 14px;text-align:center;min-width:72px}
.nota-card.aprobado{background:#f0fdf4;border-color:#bbf7d0}
.nota-card.reprobado{background:#fff1f2;border-color:#fecdd3}
.nota-card.sin{background:#f8fafc;border-color:#e2e8f0}
/* ── Barra búsqueda ── */
.search-bar{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:14px 18px;margin-bottom:18px}
.search-bar .form-control,.search-bar .form-select{font-size:13px;border-color:#e2e8f0}
.search-bar .form-control:focus,.search-bar .form-select:focus{border-color:#3b82f6;box-shadow:0 0 0 3px rgba(59,130,246,.12)}
/* ── Paginación ── */
.paginacion{display:flex;gap:4px;align-items:center;justify-content:center;flex-wrap:wrap;margin-top:16px}
.paginacion a,.paginacion span{padding:5px 11px;border-radius:7px;font-size:12px;font-weight:600;text-decoration:none;border:1px solid #e2e8f0;color:#475569}
.paginacion a:hover{background:#f1f5f9}
.paginacion .activa{background:#3b82f6;color:#fff;border-color:#3b82f6}
.paginacion .puntos{border:none;color:#94a3b8}
.info-total{font-size:12px;color:#94a3b8;text-align:center;margin-bottom:8px}
</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 mb-3">
      <div>
        <h4>Gestión de Prácticas</h4>
        <p style="font-size:13px;color:#94a3b8">Aprobación, seguimiento y calificación &nbsp;·&nbsp; <?=$totalRegistros?> práctica<?=$totalRegistros!=1?'s':''?> encontrada<?=$totalRegistros!=1?'s':''?></p>
      </div>
    </div>
    <?=flashHtml()?>

    <!-- ══ BARRA DE BÚSQUEDA Y FILTROS ══ -->
    <form method="GET" action="practicas.php" class="search-bar">
      <div class="row g-2 align-items-end">
        <!-- Buscar por nombre -->
        <div class="col-12 col-md-3">
          <label style="font-size:11px;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.5px">Buscar estudiante o empresa</label>
          <div class="input-group input-group-sm mt-1">
            <span class="input-group-text" style="background:#f8fafc;border-color:#e2e8f0"><i class="fa fa-search" style="font-size:11px;color:#94a3b8"></i></span>
            <input type="text" name="buscar" class="form-control" placeholder="Nombre o empresa..." value="<?=htmlspecialchars($filtroBuscar)?>">
          </div>
        </div>
        <!-- Filtro carrera -->
        <div class="col-12 col-md-3">
          <label style="font-size:11px;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.5px">Carrera</label>
          <select name="carrera" id="sel-carrera" class="form-select form-select-sm mt-1">
            <option value="">Todas las carreras</option>
            <?php foreach($carreras as $c): ?>
            <option value="<?=$c['id_carrera']?>" <?=$filtroCarrera==$c['id_carrera']?'selected':''?>>
              <?=htmlspecialchars($c['nombre'])?>
            </option>
            <?php endforeach; ?>
          </select>
        </div>
        <!-- Filtro periodo/ciclo -->
        <div class="col-12 col-md-2">
          <label style="font-size:11px;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.5px">Ciclo / Período</label>
          <select name="periodo" id="sel-periodo" class="form-select form-select-sm mt-1">
            <option value="">Todos los ciclos</option>
            <?php foreach($periodos as $pe): ?>
            <option value="<?=$pe['id_periodo']?>" <?=$filtroPeriodo==$pe['id_periodo']?'selected':''?>>
              <?=htmlspecialchars($pe['nombre'])?>
            </option>
            <?php endforeach; ?>
          </select>
        </div>
        <!-- Filtro estado -->
        <div class="col-12 col-md-2">
          <label style="font-size:11px;font-weight:700;color:#94a3b8;text-transform:uppercase;letter-spacing:.5px">Estado</label>
          <select name="estado" class="form-select form-select-sm mt-1">
            <option value="">Todos</option>
            <?php foreach(['postulado','aprobado','en_progreso','calificado','completado','rechazado'] as $e): ?>
            <option value="<?=$e?>" <?=$filtroEstado===$e?'selected':''?>><?=ucfirst(str_replace('_',' ',$e))?></option>
            <?php endforeach; ?>
          </select>
        </div>
        <!-- Botones -->
        <div class="col-12 col-md-2 d-flex gap-2">
          <button type="submit" class="btn btn-primary btn-sm flex-fill"><i class="fa fa-search me-1"></i>Filtrar</button>
          <a href="practicas.php" class="btn btn-outline-secondary btn-sm" title="Limpiar filtros"><i class="fa fa-xmark"></i></a>
        </div>
      </div>
    </form>

    <!-- ══ TABLA ══ -->
    <div class="tbl-wrap">
      <table class="table table-borderless mb-0">
        <thead>
          <tr style="font-size:11px;text-transform:uppercase;color:#94a3b8;letter-spacing:.4px">
            <th class="px-3 py-2">Estudiante</th>
            <th>Empresa</th>
            <th>Carrera</th>
            <th>Período</th>
            <th>Avance</th>
            <th>Estado</th>
            <th class="text-center" style="color:#7c3aed;font-weight:700">Calificación</th>
            <th class="text-center">Acciones</th>
          </tr>
        </thead>
        <tbody>
          <?php if (empty($practicas)): ?>
          <tr><td colspan="8" class="text-center text-muted py-5">
            <i class="fa fa-magnifying-glass fa-2x mb-2 d-block" style="color:#d1d5db"></i>
            Sin prácticas con los filtros seleccionados.
          </td></tr>
          <?php else: foreach ($practicas as $p):
            $pct = pct($p['horas_cumplidas'], $p['horas_requeridas']);
            $nf  = $p['nota_final'];
            $aprobado = $nf !== null && (float)$nf >= 70;
            $reprobado = $nf !== null && (float)$nf < 70;
            $notaClass = $nf === null ? 'sin' : ($aprobado ? 'aprobado' : 'reprobado');
          ?>
          <tr style="vertical-align:middle">
            <td class="px-3 py-2">
              <div style="font-weight:600;font-size:13px"><?=htmlspecialchars($p['estudiante'])?></div>
              <?php if($p['cedula']):?>
              <div style="font-size:10px;color:#94a3b8;font-family:monospace"><?=htmlspecialchars($p['cedula'])?></div>
              <?php endif;?>
              <?php if($p['tutor']):?>
              <div style="font-size:10px;color:#94a3b8;margin-top:1px"><i class="fa fa-chalkboard-user" style="font-size:9px"></i> <?=htmlspecialchars($p['tutor'])?></div>
              <?php endif;?>
            </td>
            <td style="font-size:12px"><?=htmlspecialchars($p['empresa'])?></td>
            <td style="font-size:11px;color:#64748b;max-width:130px;line-height:1.3"><?=htmlspecialchars($p['carrera'])?></td>
            <td style="font-size:12px;white-space:nowrap"><?=htmlspecialchars($p['periodo'])?></td>
            <td style="min-width:110px">
              <div style="display:flex;align-items:center;gap:7px">
                <div style="flex:1;background:#e2e8f0;border-radius:4px;height:6px">
                  <div style="width:<?=$pct?>%;background:<?=$pct>=100?'#16a34a':($pct>=50?'#3b82f6':'#f59e0b')?>;height:6px;border-radius:4px"></div>
                </div>
                <span style="font-size:11px;color:#94a3b8;white-space:nowrap"><?=$p['horas_cumplidas']?>/<?=$p['horas_requeridas']?>h</span>
              </div>
              <div style="font-size:10px;color:#94a3b8;margin-top:2px;text-align:right"><?=$pct?>%</div>
            </td>
            <td><?=badgeEstado($p['estado'])?></td>

            <!-- ══ COLUMNA CALIFICACIÓN ══ -->
            <td class="text-center">
              <div class="nota-card <?=$notaClass?>">
                <?php if ($nf !== null): ?>
                  <?php
                    $nfVal = (float)$nf;
                    $color = $nfVal >= 90 ? '#16a34a' : ($nfVal >= 70 ? '#d97706' : '#dc2626');
                    $label = $nfVal >= 90 ? 'Excelente' : ($nfVal >= 70 ? 'Aprobado' : 'Reprobado');
                  ?>
                  <div style="font-size:22px;font-weight:800;color:<?=$color?>;line-height:1"><?=number_format($nfVal,2)?></div>
                  <div style="font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.4px;color:<?=$color?>;margin-top:2px"><?=$label?></div>
                  <?php if($p['fecha_calificacion']):?>
                  <div style="font-size:9px;color:#94a3b8;margin-top:3px"><?=date('d/m/Y',strtotime($p['fecha_calificacion']))?></div>
                  <?php endif;?>
                  <!-- Desglose de las 4 notas parciales -->
                  <div style="margin-top:6px;border-top:1px solid #e2e8f0;padding-top:5px;text-align:left;">
                    <?php
                      $notas4 = [
                        ['🎓 Tutor',    $p['nota_tutor_academico'], '25%'],
                        ['🏢 Empresa',  $p['nota_empresa_100'] ?? ($p['nota_tutor_empresa'] !== null ? $p['nota_tutor_empresa'] * 10 : null), '30%'],
                        ['📓 Bitácoras',$p['nota_bitacoras'],       '20%'],
                        ['📄 Informe',  $p['nota_informe'],         '25%'],
                      ];
                      foreach ($notas4 as [$lbl, $val, $peso]):
                        $vc = $val !== null ? (float)$val : null;
                        $nc = $vc === null ? '#94a3b8' : ($vc >= 70 ? '#16a34a' : '#dc2626');
                    ?>
                    <div style="display:flex;justify-content:space-between;align-items:center;font-size:9px;margin-bottom:2px;">
                      <span style="color:#64748b;"><?=$lbl?> <span style="color:#cbd5e1">(<?=$peso?>)</span></span>
                      <span style="font-weight:700;color:<?=$nc?>"><?= $vc !== null ? number_format($vc,1) : '—' ?></span>
                    </div>
                    <?php endforeach; ?>
                  </div>
                <?php else: ?>
                  <!-- Sin nota final: mostrar parciales disponibles -->
                  <?php
                    $hayParcial = $p['nota_tutor_academico'] !== null
                               || $p['nota_tutor_empresa'] !== null
                               || $p['nota_bitacoras'] !== null
                               || $p['nota_informe'] !== null;
                  ?>
                  <?php if ($hayParcial): ?>
                  <div style="font-size:9px;font-weight:700;color:#94a3b8;margin-bottom:4px;text-transform:uppercase;letter-spacing:.4px">En proceso</div>
                  <div style="text-align:left;">
                    <?php
                      $notas4 = [
                        ['🎓 Tutor',    $p['nota_tutor_academico'], '25%'],
                        ['🏢 Empresa',  $p['nota_empresa_100'] ?? ($p['nota_tutor_empresa'] !== null ? $p['nota_tutor_empresa'] * 10 : null), '30%'],
                        ['📓 Bitácoras',$p['nota_bitacoras'],       '20%'],
                        ['📄 Informe',  $p['nota_informe'],         '25%'],
                      ];
                      foreach ($notas4 as [$lbl, $val, $peso]):
                        $vc = $val !== null ? (float)$val : null;
                        $nc = $vc === null ? '#cbd5e1' : ($vc >= 70 ? '#16a34a' : '#dc2626');
                    ?>
                    <div style="display:flex;justify-content:space-between;font-size:9px;margin-bottom:2px;">
                      <span style="color:#94a3b8;"><?=$lbl?></span>
                      <span style="font-weight:700;color:<?=$nc?>"><?= $vc !== null ? number_format($vc,1) : '—' ?></span>
                    </div>
                    <?php endforeach; ?>
                  </div>
                  <?php else: ?>
                  <div style="font-size:11px;color:#94a3b8">
                    <i class="fa fa-clock" style="font-size:13px;display:block;margin-bottom:3px"></i>
                    Sin nota
                  </div>
                  <?php endif; ?>
                <?php endif; ?>
              </div>
            </td>

            <!-- ══ COLUMNA ACCIONES ══ -->
            <td class="text-center">
              <div class="d-flex flex-column gap-1 align-items-center">
                <?php if (!empty($p['inf_pdf'])): ?>
                <a href="<?= htmlspecialchars(getPdfUrl((int)$p['id_practica'])) ?>"
                   target="_blank"
                   class="btn btn-sm btn-danger"
                   style="font-size:11px;white-space:nowrap;width:100%;"
                   title="Ver informe final enviado por el estudiante">
                  <i class="fa fa-file-pdf me-1"></i>Ver PDF
                </a>
                <?php endif; ?>
                <button class="btn btn-sm btn-outline-secondary btn-gestionar"
                  data-id="<?=$p['id_practica']?>"
                  data-estado="<?=$p['estado']?>"
                  data-pdf="<?= !empty($p['inf_pdf']) ? htmlspecialchars(getPdfUrl((int)$p['id_practica'])) : '' ?>"
                  style="font-size:11px;white-space:nowrap;width:100%;"
                  title="Cambiar estado de la práctica">
                  <i class="fa fa-pen-to-square me-1"></i>Estado
                </button>
              </div>
            </td>
          </tr>
          <?php endforeach; endif; ?>
        </tbody>
      </table>
    </div>

    <!-- ══ PAGINACIÓN ══ -->
    <?php if ($totalPaginas > 1): ?>
    <div class="info-total">
      Mostrando <?=min($offset+1,$totalRegistros)?>–<?=min($offset+$porPagina,$totalRegistros)?> de <?=$totalRegistros?> prácticas
    </div>
    <div class="paginacion">
      <?php if ($pagina > 1): ?>
      <a href="<?=urlFiltro(['pagina'=>1])?>"><i class="fa fa-angles-left"></i></a>
      <a href="<?=urlFiltro(['pagina'=>$pagina-1])?>"><i class="fa fa-angle-left"></i></a>
      <?php endif; ?>

      <?php
        $inicio = max(1, $pagina - 2);
        $fin    = min($totalPaginas, $pagina + 2);
        if ($inicio > 1) echo '<span class="puntos">…</span>';
        for ($i = $inicio; $i <= $fin; $i++):
      ?>
        <?php if ($i === $pagina): ?>
        <span class="activa"><?=$i?></span>
        <?php else: ?>
        <a href="<?=urlFiltro(['pagina'=>$i])?>"><?=$i?></a>
        <?php endif; ?>
      <?php endfor; ?>
      <?php if ($fin < $totalPaginas) echo '<span class="puntos">…</span>'; ?>

      <?php if ($pagina < $totalPaginas): ?>
      <a href="<?=urlFiltro(['pagina'=>$pagina+1])?>"><i class="fa fa-angle-right"></i></a>
      <a href="<?=urlFiltro(['pagina'=>$totalPaginas])?>"><i class="fa fa-angles-right"></i></a>
      <?php endif; ?>
    </div>
    <?php endif; ?>

    <!-- ══ MODAL gestionar estado ══ -->
    <div class="modal fade" id="modalEstado" tabindex="-1">
      <div class="modal-dialog"><div class="modal-content">
        <div class="modal-header">
          <h5 class="modal-title"><i class="fa fa-pen-to-square me-2"></i>Gestionar práctica</h5>
          <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
        </div>
        <form method="POST">
          <input type="hidden" name="id_practica"     id="m-id">
          <input type="hidden" name="filtro_estado"   value="<?=htmlspecialchars($filtroEstado)?>">
          <input type="hidden" name="filtro_carrera"  value="<?=htmlspecialchars($filtroCarrera)?>">
          <input type="hidden" name="filtro_periodo"  value="<?=htmlspecialchars($filtroPeriodo)?>">
          <input type="hidden" name="filtro_buscar"   value="<?=htmlspecialchars($filtroBuscar)?>">
          <div class="modal-body">

            <!-- PDF del informe (se muestra solo si existe) -->
            <div id="m-pdf-wrap" style="display:none;margin-bottom:16px;">
              <a id="m-pdf-btn" href="#" target="_blank"
                 style="display:flex;align-items:center;gap:8px;padding:11px 14px;
                        background:#fff1f2;border:1px solid #fecdd3;border-radius:8px;
                        text-decoration:none;color:#dc2626;font-size:13px;font-weight:700;">
                <i class="fa fa-file-pdf fa-lg"></i>
                <span>Ver informe final del estudiante (PDF)</span>
                <i class="fa fa-external-link fa-xs ms-auto"></i>
              </a>
              <div style="font-size:11px;color:#94a3b8;margin-top:5px;padding-left:2px;">
                <i class="fa fa-circle-info me-1"></i>Revisa el informe antes de cambiar el estado.
              </div>
            </div>

            <div class="mb-3">
              <label class="form-label fw-semibold">Nuevo estado</label>
              <select name="estado" class="form-select" id="m-estado">
                <option value="aprobado">✅ Aprobado — práctica en curso</option>
                <option value="en_progreso">⚡ En progreso</option>
                <option value="completado">🏆 Completado — práctica finalizada</option>
                <option value="calificado">🎓 Calificado — con nota final</option>
                <option value="rechazado">❌ Rechazado</option>
              </select>
            </div>
            <div class="mb-3">
              <label class="form-label fw-semibold">Observaciones <span style="font-weight:400;color:#94a3b8;">(opcional)</span></label>
              <textarea name="observaciones" class="form-control" rows="2"
                        placeholder="Comentarios para el estudiante..."></textarea>
            </div>
            <div class="mb-2" id="m-motivo-wrap" style="display:none;">
              <label class="form-label fw-semibold" style="color:#dc2626;">Motivo de rechazo <span style="color:#dc2626;">*</span></label>
              <textarea name="motivo_rechazo" class="form-control" rows="2"
                        placeholder="Explica el motivo del rechazo..."></textarea>
            </div>
          </div>
          <div class="modal-footer">
            <button type="button" class="btn btn-outline-secondary" data-bs-dismiss="modal">Cancelar</button>
            <button type="submit" class="btn btn-primary"><i class="fa fa-floppy-disk me-1"></i>Guardar cambio</button>
          </div>
        </form>
      </div></div>
    </div>

  </main>
</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 src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.1.0-rc.0/js/select2.min.js"></script>
<script>
$(function(){

  // ── Select2 combobox para carrera y ciclo ──
  $('#sel-carrera').select2({
    placeholder: 'Buscar carrera...',
    allowClear: true,
    width: '100%',
    language: {
      noResults: function(){ return 'Sin resultados'; },
      searching:  function(){ return 'Buscando...'; }
    }
  });

  $('#sel-periodo').select2({
    placeholder: 'Buscar ciclo...',
    allowClear: true,
    width: '100%',
    language: {
      noResults: function(){ return 'Sin resultados'; },
      searching:  function(){ return 'Buscando...'; }
    }
  });

  // ── Modal gestionar estado ──
  $(document).on('click', '.btn-gestionar', function(){
    var id     = $(this).data('id');
    var estado = $(this).data('estado');
    var pdf    = $(this).data('pdf') || '';
    $('#m-id').val(id);
    $('#m-estado option[value="'+estado+'"]').prop('selected', true);

    // Mostrar PDF si existe
    if (pdf) {
      $('#m-pdf-btn').attr('href', pdf);
      $('#m-pdf-wrap').show();
    } else {
      $('#m-pdf-wrap').hide();
    }

    toggleMotivo(estado);
    new bootstrap.Modal('#modalEstado').show();
  });

  $('#m-estado').on('change', function(){ toggleMotivo($(this).val()); });

  function toggleMotivo(est){
    $('#m-motivo-wrap').toggle(est === 'rechazado');
  }
  toggleMotivo($('#m-estado').val());
});
</script>
</body>
</html>