<?php
require_once __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'app.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'auth.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'functions.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'flash.php';
requireRol(ROL_ADMIN);

$user      = currentUser();
$db        = getDB();
$pageTitle = 'Carreras';
$idInstituto = (int)($user['id_instituto'] ?? 0);

// ── CREAR / EDITAR ──────────────────────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $id         = (int)($_POST['id_carrera'] ?? 0);
    $codigo     = strtoupper(trim($_POST['codigo'] ?? ''));
    $nombre     = trim($_POST['nombre'] ?? '');
    $horas      = (int)($_POST['horas_minimas'] ?? 400);
    $horas_vinc = (int)($_POST['horas_minimas_vinculacion'] ?? 160);
    $nivel      = in_array($_POST['nivel'] ?? '', ['tecnico','tecnologo','tercer_nivel'])
                  ? $_POST['nivel'] : 'tercer_nivel';
    $activa     = isset($_POST['activa']) ? 1 : 0;

    if (!$codigo || !$nombre) {
        flashSet('err', 'El código y el nombre son obligatorios.');
        header('Location: carreras.php'); exit;
    }
    if ($horas < 6 || $horas > 2000) {
        flashSet('err', 'Las horas mínimas de práctica deben estar entre 100 y 2000.');
        header('Location: carreras.php'); exit;
    }
    if ($horas_vinc < 4 || $horas_vinc > 1000) {
        flashSet('err', 'Las horas mínimas de vinculación deben estar entre 40 y 1000.');
        header('Location: carreras.php'); exit;
    }

    if ($id) {
        // Verificar que la carrera pertenece al instituto actual
        if ($idInstituto) {
            $chk = $db->prepare("SELECT id_carrera FROM carreras WHERE id_carrera=:id AND id_instituto=:inst");
            $chk->execute([':id'=>$id, ':inst'=>$idInstituto]);
            if (!$chk->fetch()) { flashSet('err','Carrera no encontrada.'); header('Location: carreras.php'); exit; }
        }
        $dup = $db->prepare("SELECT id_carrera FROM carreras WHERE codigo=:c AND id_carrera<>:id" . ($idInstituto ? " AND id_instituto=:inst" : ""));
        $dupParams = [':c'=>$codigo,':id'=>$id];
        if ($idInstituto) $dupParams[':inst'] = $idInstituto;
        $dup->execute($dupParams);
        if ($dup->fetch()) { flashSet('err','El código "'.$codigo.'" ya está en uso.'); header('Location: carreras.php'); exit; }

        $db->prepare("UPDATE carreras SET codigo=:c, nombre=:n, horas_minimas=:h, horas_minimas_vinculacion=:hv, nivel=:nv, activa=:a WHERE id_carrera=:id")
           ->execute([':c'=>$codigo,':n'=>$nombre,':h'=>$horas,':hv'=>$horas_vinc,':nv'=>$nivel,':a'=>$activa,':id'=>$id]);
        flashSet('ok', 'Carrera actualizada correctamente.');
        registrarAudit($user['id'], 'editar_carrera', 'carreras', $id);
    } else {
        $dup = $db->prepare("SELECT id_carrera FROM carreras WHERE codigo=:c" . ($idInstituto ? " AND id_instituto=:inst" : ""));
        $dupParams = [':c'=>$codigo];
        if ($idInstituto) $dupParams[':inst'] = $idInstituto;
        $dup->execute($dupParams);
        if ($dup->fetch()) { flashSet('err','El código "'.$codigo.'" ya existe.'); header('Location: carreras.php'); exit; }

        $db->prepare("INSERT INTO carreras (codigo,nombre,horas_minimas,horas_minimas_vinculacion,nivel,activa,id_instituto) VALUES(:c,:n,:h,:hv,:nv,:a,:inst)")
           ->execute([':c'=>$codigo,':n'=>$nombre,':h'=>$horas,':hv'=>$horas_vinc,':nv'=>$nivel,':a'=>1,':inst'=>$idInstituto?:null]);
        flashSet('ok', 'Carrera creada correctamente.');
        registrarAudit($user['id'], 'crear_carrera', 'carreras');
    }
    header('Location: carreras.php'); exit;
}

// ── TOGGLE ACTIVA ───────────────────────────────────────────
if (isset($_GET['toggle']) && is_numeric($_GET['toggle'])) {
    $toggleId = (int)$_GET['toggle'];
    if ($idInstituto) {
        $db->prepare("UPDATE carreras SET activa = NOT activa WHERE id_carrera=:id AND id_instituto=:inst")
           ->execute([':id' => $toggleId, ':inst' => $idInstituto]);
    } else {
        $db->prepare("UPDATE carreras SET activa = NOT activa WHERE id_carrera=:id")
           ->execute([':id' => $toggleId]);
    }
    registrarAudit($user['id'], 'toggle_carrera', 'carreras', $toggleId);
    header('Location: carreras.php'); exit;
}

// ── CARGAR CARRERAS CON ESTADÍSTICAS ───────────────────────
$whereCarr = $idInstituto ? "WHERE c.id_instituto = $idInstituto" : "";
$carreras = $db->query("
    SELECT c.*,
           COALESCE(c.horas_minimas_vinculacion, 160)              AS horas_minimas_vinculacion,
           COUNT(DISTINCT e.id_estudiante)                          AS total_estudiantes,
           COUNT(DISTINCT pr.id_practica)                           AS total_practicas,
           SUM(pr.estado = 'completado')                            AS completadas,
           SUM(pr.estado = 'en_progreso')                           AS en_progreso,
           ROUND(AVG(pr.horas_cumplidas), 1)                        AS prom_horas,
           COUNT(DISTINCT coord.id_coordinador)                     AS coordinadores
    FROM carreras c
    LEFT JOIN estudiantes e          ON e.id_carrera     = c.id_carrera
    LEFT JOIN practicas pr           ON pr.id_estudiante = e.id_estudiante
    LEFT JOIN coordinador_carrera cc ON cc.id_carrera    = c.id_carrera
    LEFT JOIN coordinadores coord    ON coord.id_coordinador = cc.id_coordinador
    $whereCarr
    GROUP BY c.id_carrera
    ORDER BY c.activa DESC, c.nombre ASC
")->fetchAll();

// ── Carrera a editar ────────────────────────────────────────
$editar = null;
if (isset($_GET['editar']) && is_numeric($_GET['editar'])) {
    $instCondCarr = $idInstituto ? " AND id_instituto=:inst" : "";
    $stE = $db->prepare("SELECT * FROM carreras WHERE id_carrera=:id$instCondCarr");
    $stEParams = [':id' => (int)$_GET['editar']];
    if ($idInstituto) $stEParams[':inst'] = $idInstituto;
    $stE->execute($stEParams);
    $editar = $stE->fetch();
}

$nivelLabels = ['tecnico'=>'Técnico','tecnologo'=>'Tecnólogo','tercer_nivel'=>'Tercer nivel'];
$nivelColors = ['tecnico'=>'#f59e0b','tecnologo'=>'#8b5cf6','tercer_nivel'=>'#3b82f6'];
?>
<!DOCTYPE html>
<html lang="es">
<head><?php include __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'head.php'; ?>
<link rel="stylesheet" href="<?= BASE_URL ?>/assets/css/sidebar-admin.css">
<style>
  .carrera-card {
    transition: box-shadow .2s, transform .15s;
  }
  .carrera-card:hover {
    box-shadow: 0 8px 24px rgba(0,0,0,.10) !important;
    transform: translateY(-2px);
  }
</style>
</head>
<body>
<?php include __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'navbar.php'; ?>
<div class="app-shell">
  <?php $sbActivo = 'carreras'; include __DIR__ . '/../../includes/sidebar_admin.php'; ?>

  <main class="main-area">
    <div class="page-header d-flex justify-content-between align-items-start flex-wrap gap-2">
      <div>
        <h4>Carreras</h4>
        <p>Gestión de carreras habilitadas para prácticas preprofesionales y vinculación</p>
      </div>
      <button class="btn btn-primary btn-sm" id="btnNueva">
        <i class="fa fa-plus me-1"></i>Nueva carrera
      </button>
    </div>

    <?= flashHtml() ?>

    <!-- Resumen rápido -->
    <div class="row g-3 mb-4">
      <div class="col-6 col-lg-3">
        <div class="stat-card">
          <div>
            <div class="stat-num" style="color:#3b82f6;"><?= count($carreras) ?></div>
            <div class="stat-label">Total carreras</div>
          </div>
          <div class="stat-icon">🎓</div>
        </div>
      </div>
      <div class="col-6 col-lg-3">
        <div class="stat-card">
          <div>
            <div class="stat-num" style="color:#16a34a;"><?= count(array_filter($carreras, fn($c) => $c['activa'])) ?></div>
            <div class="stat-label">Activas</div>
          </div>
          <div class="stat-icon">✅</div>
        </div>
      </div>
      <div class="col-6 col-lg-3">
        <div class="stat-card">
          <div>
            <div class="stat-num" style="color:#f59e0b;"><?= array_sum(array_column($carreras,'total_estudiantes')) ?></div>
            <div class="stat-label">Estudiantes totales</div>
          </div>
          <div class="stat-icon">👥</div>
        </div>
      </div>
      <div class="col-6 col-lg-3">
        <div class="stat-card">
          <div>
            <div class="stat-num" style="color:#8b5cf6;"><?= array_sum(array_column($carreras,'total_practicas')) ?></div>
            <div class="stat-label">Prácticas totales</div>
          </div>
          <div class="stat-icon">📋</div>
        </div>
      </div>
    </div>

    <!-- Cards de carreras -->
    <div class="row g-3" id="grid-carreras">
      <?php foreach ($carreras as $c):
        $nivelColor = $nivelColors[$c['nivel']] ?? '#64748b';
        $nivelLabel = $nivelLabels[$c['nivel']] ?? $c['nivel'];
        $horasVinc  = (int)($c['horas_minimas_vinculacion'] ?? 160);
        $pctComp    = $c['total_practicas'] > 0
                      ? round($c['completadas'] / $c['total_practicas'] * 100) : 0;
        $colorPct   = $pctComp >= 80 ? '#16a34a' : ($pctComp >= 50 ? '#d97706' : ($c['total_practicas'] > 0 ? '#dc2626' : '#cbd5e1'));
      ?>
      <div class="col-md-6 col-lg-4">
        <div style="background:#ffffff;
                    border:1px solid <?= $c['activa'] ? '#e2e8f0' : '#fecaca' ?>;
                    border-radius:14px;
                    overflow:hidden;
                    height:100%;
                    box-shadow:0 1px 6px rgba(0,0,0,.06);"
             class="carrera-card">

          <!-- Franja de color superior según nivel -->
          <div style="height:5px;background:<?= $c['activa'] ? $nivelColor : '#fca5a5' ?>;"></div>

          <div style="padding:18px 20px 20px;">

            <!-- Header -->
            <div style="display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:14px;">
              <div style="flex:1;min-width:0;padding-right:8px;">
                <span style="font-size:10px;padding:2px 10px;border-radius:20px;font-weight:700;
                             background:<?= $nivelColor ?>18;color:<?= $nivelColor ?>;
                             border:1px solid <?= $nivelColor ?>44;
                             margin-bottom:8px;display:inline-block;">
                  <?= $nivelLabel ?>
                </span>
                <h6 style="font-size:14px;font-weight:700;margin:4px 0 2px;line-height:1.4;color:#0f172a;">
                  <?= htmlspecialchars($c['nombre']) ?>
                </h6>
                <div style="font-family:'JetBrains Mono',monospace;font-size:11px;color:#94a3b8;">
                  <?= htmlspecialchars($c['codigo']) ?>
                </div>
              </div>
              <!-- Badge estado -->
              <?php if ($c['activa']): ?>
                <span style="flex-shrink:0;font-size:10px;padding:3px 10px;border-radius:20px;
                             font-weight:700;background:#dcfce7;color:#15803d;border:1px solid #86efac;white-space:nowrap;">
                  ● Activa
                </span>
              <?php else: ?>
                <span style="flex-shrink:0;font-size:10px;padding:3px 10px;border-radius:20px;
                             font-weight:700;background:#fee2e2;color:#dc2626;border:1px solid #fca5a5;white-space:nowrap;">
                  ● Inactiva
                </span>
              <?php endif; ?>
            </div>

            <!-- Horas: Prácticas + Vinculación (dos cajas iguales) -->
            <div style="display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-bottom:14px;">

              <!-- Prácticas CES -->
              <div style="background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;
                          padding:10px 12px;display:flex;justify-content:space-between;align-items:center;">
                <div>
                  <div style="font-size:9px;color:#3b82f6;text-transform:uppercase;letter-spacing:.7px;font-weight:700;margin-bottom:2px;">
                    Prácticas CES
                  </div>
                  <div style="font-size:20px;font-weight:800;color:#1d4ed8;line-height:1.1;">
                    <?= $c['horas_minimas'] ?><span style="font-size:11px;font-weight:500;color:#3b82f6;"> h</span>
                  </div>
                </div>
                <div style="font-size:22px;opacity:.4;">⏱️</div>
              </div>

              <!-- Vinculación -->
              <div style="background:#f0fdf4;border:1px solid #bbf7d0;border-radius:10px;
                          padding:10px 12px;display:flex;justify-content:space-between;align-items:center;">
                <div>
                  <div style="font-size:9px;color:#16a34a;text-transform:uppercase;letter-spacing:.7px;font-weight:700;margin-bottom:2px;">
                    Vinculación
                  </div>
                  <div style="font-size:20px;font-weight:800;color:#15803d;line-height:1.1;">
                    <?= $horasVinc ?><span style="font-size:11px;font-weight:500;color:#16a34a;"> h</span>
                  </div>
                </div>
                <div style="font-size:22px;opacity:.4;">🤝</div>
              </div>
            </div>

            <!-- Mini estadísticas -->
            <div style="display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;margin-bottom:14px;text-align:center;">
              <div style="background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;padding:8px 4px;">
                <div style="font-size:16px;font-weight:700;color:#0f172a;"><?= (int)$c['total_estudiantes'] ?></div>
                <div style="font-size:9px;color:#94a3b8;font-weight:600;">Estudiantes</div>
              </div>
              <div style="background:#fffbeb;border:1px solid #fde68a;border-radius:8px;padding:8px 4px;">
                <div style="font-size:16px;font-weight:700;color:#d97706;"><?= (int)$c['en_progreso'] ?></div>
                <div style="font-size:9px;color:#92400e;font-weight:600;">En curso</div>
              </div>
              <div style="background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;padding:8px 4px;">
                <div style="font-size:16px;font-weight:700;color:#16a34a;"><?= (int)$c['completadas'] ?></div>
                <div style="font-size:9px;color:#166534;font-weight:600;">Completadas</div>
              </div>
            </div>

            <!-- Barra de progreso -->
            <?php if ($c['total_practicas'] > 0): ?>
            <div style="margin-bottom:14px;">
              <div style="display:flex;justify-content:space-between;font-size:10px;color:#64748b;margin-bottom:5px;">
                <span>Tasa de completitud</span>
                <span style="color:<?= $colorPct ?>;font-weight:700;"><?= $pctComp ?>%</span>
              </div>
              <div style="background:#e2e8f0;border-radius:6px;height:6px;">
                <div style="width:<?= $pctComp ?>%;height:6px;border-radius:6px;background:<?= $colorPct ?>;"></div>
              </div>
            </div>
            <?php endif; ?>

            <!-- Acciones -->
            <div style="display:flex;gap:8px;border-top:1px solid #f1f5f9;padding-top:14px;">
              <a href="?editar=<?= $c['id_carrera'] ?>"
                 class="btn btn-sm flex-fill"
                 style="background:#f8fafc;border:1px solid #e2e8f0;color:#334155;font-size:12px;">
                <i class="fa fa-pen-to-square me-1"></i>Editar
              </a>
              <a href="?toggle=<?= $c['id_carrera'] ?>"
                 class="btn btn-sm"
                 title="<?= $c['activa'] ? 'Desactivar' : 'Activar' ?>"
                 data-confirm="<?= $c['activa'] ? '¿Desactivar &quot;'.$c['nombre'].'&quot;?' : '¿Activar &quot;'.$c['nombre'].'&quot;?' ?>"
                 style="background:<?= $c['activa'] ? '#fff7ed' : '#f0fdf4' ?>;
                        border:1px solid <?= $c['activa'] ? '#fed7aa' : '#bbf7d0' ?>;
                        color:<?= $c['activa'] ? '#c2410c' : '#15803d' ?>;font-size:12px;">
                <i class="fa fa-<?= $c['activa'] ? 'toggle-on' : 'toggle-off' ?>"></i>
              </a>
            </div>

          </div><!-- /padding wrapper -->
        </div>
      </div>
      <?php endforeach; ?>

      <?php if (empty($carreras)): ?>
      <div class="col-12">
        <div style="background:#ffffff;border:2px dashed #e2e8f0;border-radius:14px;
                    padding:48px;text-align:center;color:#94a3b8;">
          <div style="font-size:40px;margin-bottom:12px;">🎓</div>
          <div style="font-size:14px;font-weight:600;color:#64748b;">No hay carreras registradas.</div>
          <button class="btn btn-primary btn-sm mt-3" id="btnNueva2">
            <i class="fa fa-plus me-1"></i>Crear primera carrera
          </button>
        </div>
      </div>
      <?php endif; ?>
    </div>

  </main>
</div>

<!-- ── MODAL CREAR / EDITAR ── -->
<div class="modal fade" id="modalCarrera" tabindex="-1">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title" id="m-titulo">Nueva carrera</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
      </div>
      <form method="POST" id="formCarrera">
        <input type="hidden" name="id_carrera" id="f-id" value="0">
        <div class="modal-body">

          <div class="row g-3">
            <!-- Código -->
            <div class="col-sm-4">
              <label class="form-label">Código <span style="color:#ef4444;">*</span></label>
              <input type="text" name="codigo" id="f-cod" class="form-control"
                     required maxlength="20" placeholder="ISW-001"
                     style="font-family:'JetBrains Mono',monospace;text-transform:uppercase;">
              <div style="font-size:10px;color:#8b949e;margin-top:4px;">Se convierte a mayúsculas automáticamente</div>
            </div>

            <!-- Nivel -->
            <div class="col-sm-8">
              <label class="form-label">Nivel de formación</label>
              <div class="d-flex gap-2 mt-1" id="nivel-selector">
                <?php foreach ($nivelLabels as $k => $v): ?>
                <label style="flex:1;cursor:pointer;">
                  <input type="radio" name="nivel" value="<?= $k ?>" class="d-none nivel-radio"
                         <?= $k==='tercer_nivel'?'checked':'' ?>>
                  <div class="nivel-card" data-nivel="<?= $k ?>"
                       style="border:2px solid <?= $k==='tercer_nivel'?$nivelColors[$k]:'#e2e8f0' ?>;
                              background:<?= $k==='tercer_nivel'?$nivelColors[$k].'15':'#f8fafc' ?>;
                              border-radius:8px;padding:8px 6px;text-align:center;
                              font-size:11px;font-weight:700;transition:.15s;
                              color:<?= $k==='tercer_nivel'?$nivelColors[$k]:'#94a3b8' ?>;">
                    <?= $v ?>
                  </div>
                </label>
                <?php endforeach; ?>
              </div>
            </div>

            <!-- Nombre -->
            <div class="col-12">
              <label class="form-label">Nombre completo de la carrera <span style="color:#ef4444;">*</span></label>
              <input type="text" name="nombre" id="f-nom" class="form-control"
                     required maxlength="120" placeholder="ej: Ingeniería en Software">
            </div>

            <!-- Horas Prácticas -->
            <div class="col-md-6">
              <label class="form-label">
                <span style="color:#3b82f6;font-weight:700;">⏱️ Horas mínimas — Prácticas</span>
                <span style="color:#ef4444;">*</span>
              </label>
              <div class="input-group">
                <input type="number" name="horas_minimas" id="f-hrs" class="form-control"
                       required min="6" max="2000" value="400">
                <span class="input-group-text">h</span>
              </div>
              <div class="d-flex gap-1 mt-2 flex-wrap">
                <?php foreach ([160,240,320,400,480,640] as $h): ?>
                <button type="button" class="btn btn-sm btn-outline-secondary preset-h"
                        data-h="<?= $h ?>" style="font-size:11px;padding:2px 8px;"><?= $h ?>h</button>
                <?php endforeach; ?>
              </div>
              <div style="font-size:10px;color:#8b949e;margin-top:5px;">
                <i class="fa fa-info-circle me-1"></i>Art. 87 LOES — mínimo 400h para tercer nivel.
              </div>
            </div>

            <!-- Horas Vinculación -->
            <div class="col-md-6">
              <label class="form-label">
                <span style="color:#16a34a;font-weight:700;">🤝 Horas mínimas — Vinculación</span>
                <span style="color:#ef4444;">*</span>
              </label>
              <div class="input-group">
                <input type="number" name="horas_minimas_vinculacion" id="f-hrs-vinc" class="form-control"
                       required min="4" max="1000" value="160">
                <span class="input-group-text">h</span>
              </div>
              <div class="d-flex gap-1 mt-2 flex-wrap">
                <?php foreach ([80,120,160,200,240,320] as $h): ?>
                <button type="button" class="btn btn-sm btn-outline-secondary preset-hv"
                        data-hv="<?= $h ?>" style="font-size:11px;padding:2px 8px;"><?= $h ?>h</button>
                <?php endforeach; ?>
              </div>
              <div style="font-size:10px;color:#8b949e;margin-top:5px;">
                <i class="fa fa-info-circle me-1"></i>Horas requeridas para proyectos de vinculación.
              </div>
            </div>

            <!-- Activa -->
            <div class="col-12">
              <div class="form-check">
                <input type="checkbox" name="activa" id="f-activa" class="form-check-input" value="1" checked>
                <label class="form-check-label" for="f-activa">Carrera activa (visible para nuevas postulaciones)</label>
              </div>
            </div>
          </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 carrera
          </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>
var nivelColors = { tecnico:'#f59e0b', tecnologo:'#8b5cf6', tercer_nivel:'#3b82f6' };
var modal;

$(function () {
  modal = new bootstrap.Modal('#modalCarrera');

  // Código a mayúsculas
  $('#f-cod').on('input', function () {
    var pos = this.selectionStart;
    this.value = this.value.toUpperCase();
    this.setSelectionRange(pos, pos);
  });

  // Selector visual de nivel
  $('.nivel-radio').on('change', function () {
    var v = $(this).val();
    $('.nivel-card').each(function () {
      var n = $(this).data('nivel');
      var c = nivelColors[n];
      if (n === v) {
        $(this).css({ borderColor: c, background: c+'15', color: c });
      } else {
        $(this).css({ borderColor: '#e2e8f0', background: '#f8fafc', color: '#94a3b8' });
      }
    });
    // Sugerir horas por defecto según nivel
    if (v === 'tecnico') {
      if ($('#f-hrs').val() == 400)      $('#f-hrs').val(240);
      if ($('#f-hrs-vinc').val() == 160) $('#f-hrs-vinc').val(80);
    } else if (v === 'tecnologo') {
      if ($('#f-hrs').val() == 240)      $('#f-hrs').val(320);
      if ($('#f-hrs-vinc').val() == 80)  $('#f-hrs-vinc').val(120);
    } else {
      if ($('#f-hrs').val() < 400)       $('#f-hrs').val(400);
      if ($('#f-hrs-vinc').val() < 160)  $('#f-hrs-vinc').val(160);
    }
  });
  $('.nivel-card').on('click', function () {
    $('input[name="nivel"][value="'+$(this).data('nivel')+'"]').prop('checked',true).trigger('change');
  });

  // Presets horas prácticas
  $('.preset-h').on('click', function () { $('#f-hrs').val($(this).data('h')); });

  // Presets horas vinculación
  $('.preset-hv').on('click', function () { $('#f-hrs-vinc').val($(this).data('hv')); });

  // Confirmar toggle
  $(document).on('click', '[data-confirm]', function (e) {
    if (!confirm($(this).data('confirm'))) e.preventDefault();
  });

  // Botón nueva
  $('#btnNueva, #btnNueva2').on('click', function () { resetForm(); modal.show(); });

  function resetForm() {
    $('#m-titulo').text('Nueva carrera');
    $('#f-id').val(0);
    $('#f-cod,#f-nom').val('');
    $('#f-hrs').val(400);
    $('#f-hrs-vinc').val(160);
    $('#f-activa').prop('checked', true);
    $('input[name="nivel"][value="tercer_nivel"]').prop('checked',true).trigger('change');
  }

  // Si hay ?editar= → abrir modal prellenado
  <?php if ($editar): ?>
  $('#m-titulo').text('Editar carrera');
  $('#f-id').val(<?= $editar['id_carrera'] ?>);
  $('#f-cod').val(<?= json_encode($editar['codigo']) ?>);
  $('#f-nom').val(<?= json_encode($editar['nombre']) ?>);
  $('#f-hrs').val(<?= (int)$editar['horas_minimas'] ?>);
  $('#f-hrs-vinc').val(<?= (int)($editar['horas_minimas_vinculacion'] ?? 160) ?>);
  $('#f-activa').prop('checked', <?= $editar['activa'] ? 'true' : 'false' ?>);
  $('input[name="nivel"][value="<?= $editar['nivel'] ?>"]').prop('checked', true).trigger('change');
  modal.show();
  <?php endif; ?>
});
</script>
</body>
</html>