<?php
/**
 * modules/secretaria/cert_vinculacion.php
 * Emisión de certificados de culminación de prácticas de vinculación.
 *
 * Requiere la tabla certificados_vinculacion (ver migracion_cert_vinculacion.sql).
 *
 * Relación CES / CACES:
 *  • CES  — Art. 87: vinculación debe certificarse por la institución.
 *  • CACES — Indicador B3: participación estudiantil en proyectos sociales documentada.
 */
require_once __DIR__ . '/../../config/app.php';
require_once __DIR__ . '/../../config/onedrive.php';
require_once __DIR__ . '/../../includes/OneDriveStorage.php';
require_once __DIR__ . '/../../includes/auth.php';
require_once __DIR__ . '/../../includes/functions.php';
require_once __DIR__ . '/../../includes/flash.php';
requireRol(ROL_SECRETARIA);

$idInst = instId();
$db     = getDB();
$user   = currentUser();

// ── Asegurar tabla existe (auto-migrate seguro) ───────────
try {
    $db->exec("
        CREATE TABLE IF NOT EXISTS `certificados_vinculacion` (
          `id_cert_vinc`        int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
          `id_grupo`            int(10) UNSIGNED NOT NULL,
          `id_estudiante`       int(10) UNSIGNED NOT NULL,
          `tipo`                enum('culminacion','participacion','horas') NOT NULL DEFAULT 'culminacion',
          `codigo_qr`           varchar(80)  NOT NULL,
          `url_verificacion`    varchar(300) DEFAULT NULL,
          `archivo_pdf`         varchar(300) DEFAULT NULL,
          `archivo_pdf_firmado` varchar(400) DEFAULT NULL,
          `firmado`             tinyint(1)   NOT NULL DEFAULT 0,
          `firmado_por`         int(10) UNSIGNED DEFAULT NULL,
          `fecha_emision`       datetime NOT NULL DEFAULT current_timestamp(),
          `fecha_firma`         datetime DEFAULT NULL,
          `vigente`             tinyint(1) NOT NULL DEFAULT 1,
          PRIMARY KEY (`id_cert_vinc`),
          UNIQUE KEY `uq_cert_vinc` (`id_grupo`,`id_estudiante`,`tipo`),
          UNIQUE KEY `uq_codigo_qr_vinc` (`codigo_qr`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
    ");
} catch (Exception $e) {}

$pageTitle = 'Certificados — Vinculación';

// ══════════════════════════════════════════════════════════
//  ACCIONES POST
// ══════════════════════════════════════════════════════════

// ── EMITIR CERTIFICADO ────────────────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['emitir'])) {
    $idGrupo = (int)($_POST['id_grupo']      ?? 0);
    $idEst   = (int)($_POST['id_estudiante'] ?? 0);
    $tipo    = in_array($_POST['tipo'] ?? '', ['culminacion','participacion','horas'])
               ? $_POST['tipo'] : 'culminacion';

    if ($idGrupo && $idEst) {
        $existe = $db->prepare(
            "SELECT id_cert_vinc, vigente FROM certificados_vinculacion
             WHERE id_grupo=:g AND id_estudiante=:e AND tipo=:t"
        );
        $existe->execute([':g'=>$idGrupo, ':e'=>$idEst, ':t'=>$tipo]);
        $certEx = $existe->fetch();

        if ($certEx && $certEx['vigente'] == 1) {
            flashSet('warn', 'Este estudiante ya tiene un certificado de tipo "'.$tipo.'" vigente para este grupo.');
        } else {
            $prefix  = strtoupper(substr($tipo,0,2));
            $codigo  = 'SIGVP-V'.$prefix.'-'.str_pad($idGrupo,4,'0',STR_PAD_LEFT).'-'.str_pad($idEst,4,'0',STR_PAD_LEFT).'-'.strtoupper(substr(uniqid(),6));
            $urlVerif = BASE_URL . '/verificar_cert_vinc.php?codigo=' . $codigo;
            $archivo  = 'cert_vinc_'.$idGrupo.'_'.$idEst.'_'.$tipo.'_'.time().'.pdf';

            $db->prepare("
                INSERT INTO certificados_vinculacion
                    (id_grupo, id_estudiante, tipo, codigo_qr, url_verificacion, archivo_pdf, firmado_por, fecha_emision, vigente)
                VALUES
                    (:g, :e, :t, :cod, :url, :arch, :fp, NOW(), 1)
                ON DUPLICATE KEY UPDATE
                    codigo_qr        = VALUES(codigo_qr),
                    url_verificacion = VALUES(url_verificacion),
                    archivo_pdf      = VALUES(archivo_pdf),
                    firmado_por      = VALUES(firmado_por),
                    fecha_emision    = NOW(),
                    vigente          = 1
            ")->execute([':g'=>$idGrupo,':e'=>$idEst,':t'=>$tipo,':cod'=>$codigo,':url'=>$urlVerif,':arch'=>$archivo,':fp'=>$user['id']]);

            registrarAudit($user['id'], 'emitir_cert_vinculacion', 'certificados_vinculacion', $idGrupo);
            flashSet('ok', 'Certificado emitido. Código: ' . $codigo);
        }
    }
    header('Location: cert_vinculacion.php'); exit;
}

// ── EMITIR TODOS (grupo completo) ─────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['emitir_grupo'])) {
    $idGrupo = (int)($_POST['id_grupo'] ?? 0);
    $tipo    = in_array($_POST['tipo'] ?? '', ['culminacion','participacion','horas'])
               ? $_POST['tipo'] : 'culminacion';
    $emitidos = 0;

    if ($idGrupo) {
        $miembros = $db->prepare(
            "SELECT id_estudiante FROM miembros_grupo_vinculacion
             WHERE id_grupo=:g AND estado='activo'"
        );
        $miembros->execute([':g' => $idGrupo]);
        foreach ($miembros->fetchAll() as $m) {
            $idEst = $m['id_estudiante'];
            $existe = $db->prepare(
                "SELECT id_cert_vinc FROM certificados_vinculacion
                 WHERE id_grupo=:g AND id_estudiante=:e AND tipo=:t AND vigente=1"
            );
            $existe->execute([':g'=>$idGrupo,':e'=>$idEst,':t'=>$tipo]);
            if ($existe->fetchColumn()) continue; // ya tiene, saltar

            $prefix  = strtoupper(substr($tipo,0,2));
            $codigo  = 'SIGVP-V'.$prefix.'-'.str_pad($idGrupo,4,'0',STR_PAD_LEFT).'-'.str_pad($idEst,4,'0',STR_PAD_LEFT).'-'.strtoupper(substr(uniqid(),6));
            $urlVerif = BASE_URL . '/verificar_cert_vinc.php?codigo=' . $codigo;
            $archivo  = 'cert_vinc_'.$idGrupo.'_'.$idEst.'_'.$tipo.'_'.time().'.pdf';

            $db->prepare("
                INSERT IGNORE INTO certificados_vinculacion
                    (id_grupo, id_estudiante, tipo, codigo_qr, url_verificacion, archivo_pdf, firmado_por, fecha_emision, vigente)
                VALUES (:g,:e,:t,:cod,:url,:arch,:fp,NOW(),1)
            ")->execute([':g'=>$idGrupo,':e'=>$idEst,':t'=>$tipo,':cod'=>$codigo,':url'=>$urlVerif,':arch'=>$archivo,':fp'=>$user['id']]);
            $emitidos++;
        }
        registrarAudit($user['id'], 'emitir_cert_vinculacion_grupo', 'certificados_vinculacion', $idGrupo);
        flashSet('ok', "Se emitieron $emitidos certificado(s) para el grupo.");
    }
    header('Location: cert_vinculacion.php'); exit;
}

// ── ANULAR CERTIFICADO ────────────────────────────────────
if (isset($_GET['anular']) && is_numeric($_GET['anular'])) {
    $db->prepare("UPDATE certificados_vinculacion SET vigente=0 WHERE id_cert_vinc=:id")
       ->execute([':id' => (int)$_GET['anular']]);
    registrarAudit($user['id'], 'anular_cert_vinculacion', 'certificados_vinculacion', (int)$_GET['anular']);
    flashSet('ok', 'Certificado anulado.');
    header('Location: cert_vinculacion.php'); exit;
}

// ── SUBIR PDF FIRMADO ─────────────────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['subir_firmado'])) {
    $idCert = (int)($_POST['id_cert_vinc'] ?? 0);
    $arch   = $_FILES['pdf_firmado'] ?? null;

    if (!$idCert) {
        flashSet('err', 'Certificado inválido.');
    } elseif (!$arch || $arch['error'] !== UPLOAD_ERR_OK) {
        flashSet('err', 'Debes seleccionar un archivo PDF.');
    } elseif ($arch['size'] > 15 * 1024 * 1024) {
        flashSet('err', 'El archivo no debe superar 15 MB.');
    } elseif (strtolower(pathinfo($arch['name'], PATHINFO_EXTENSION)) !== 'pdf') {
        flashSet('err', 'Solo se aceptan archivos PDF.');
    } else {
        $nombreArch = 'certv_firmado_' . $idCert . '_' . time() . '.pdf';
        try {
            $rutaOD = OneDriveStorage::upload($arch['tmp_name'], 'certificados', $nombreArch, (string)$idCert, $idInst);
            $db->prepare("
                UPDATE certificados_vinculacion
                SET archivo_pdf_firmado=:arch, firmado=1, firmado_por=:fp, fecha_firma=NOW()
                WHERE id_cert_vinc=:id
            ")->execute([':arch'=>$rutaOD,':fp'=>$user['id'],':id'=>$idCert]);
            flashSet('ok', 'PDF firmado subido correctamente.');
        } catch(Exception $e) {
            flashSet('err', 'Error al subir a OneDrive: '.$e->getMessage());
        }
    }
    header('Location: cert_vinculacion.php'); exit;
}

// ══════════════════════════════════════════════════════════
//  CONSULTAS DE DATOS
// ══════════════════════════════════════════════════════════
$filtroPer  = (int)($_GET['periodo']  ?? 0);
$filtroVig  = $_GET['vig']    ?? 'vigentes';
$filtroGrupo= (int)($_GET['grupo']   ?? 0);
$buscar     = trim($_GET['q'] ?? '');

$periodos = $db->query(
    "SELECT id_periodo,nombre,activo FROM periodos_academicos WHERE 1=1".instCond()." ORDER BY id_periodo DESC"
)->fetchAll();
$pa = $db->query("SELECT id_periodo FROM periodos_academicos WHERE activo=1".($idInst?" AND id_instituto=$idInst":"")." LIMIT 1")->fetch();
$idPerActivo = $pa ? $pa['id_periodo'] : ($periodos[0]['id_periodo'] ?? 0);
if (!$filtroPer && !isset($_GET['periodo'])) $filtroPer = $idPerActivo;

// ── Grupos completados (candidatos a certificar) ──────────
$whereG = ['g.estado = \'completado\''];
$prmG   = [];
if ($idInst)    { $whereG[] = "g.id_instituto = $idInst"; }
if ($filtroPer) { $whereG[] = "g.id_periodo = :per"; $prmG[':per'] = $filtroPer; }

$stGrupos = $db->prepare("
    SELECT g.id_grupo, g.nombre_proyecto, g.estado, g.horas_cumplidas, g.horas_requeridas,
           g.fecha_inicio, g.fecha_fin,
           pa.nombre AS periodo,
           IFNULL(org.nombre, COALESCE(g.org_nueva_nombre,'—')) AS organizacion,
           COUNT(DISTINCT m.id_estudiante) AS total_miembros,
           CONCAT(ut.apellidos,' ',ut.nombres) AS tutor_nombre,
           SUM(CASE WHEN cv.id_cert_vinc IS NOT NULL AND cv.vigente=1 THEN 1 ELSE 0 END) AS ya_certificados
    FROM grupos_vinculacion g
    LEFT JOIN periodos_academicos pa ON pa.id_periodo = g.id_periodo
    LEFT JOIN organizaciones_beneficiarias org ON org.id_organizacion = g.id_organizacion
    LEFT JOIN miembros_grupo_vinculacion m ON m.id_grupo=g.id_grupo AND m.estado='activo'
    LEFT JOIN tutores t  ON t.id_tutor = g.id_tutor
    LEFT JOIN usuarios ut ON ut.id_usuario = t.id_usuario
    LEFT JOIN certificados_vinculacion cv ON cv.id_grupo=g.id_grupo AND cv.tipo='culminacion'
    WHERE " . implode(' AND ', $whereG) . "
    GROUP BY g.id_grupo
    ORDER BY g.updated_at DESC
");
$stGrupos->execute($prmG);
$grupos = $stGrupos->fetchAll();

// ── Certificados emitidos (listado) ───────────────────────
$whereC = ['1=1'];
$prmC   = [];
if ($filtroVig === 'vigentes') { $whereC[] = 'cv.vigente=1'; }
if ($filtroVig === 'anulados') { $whereC[] = 'cv.vigente=0'; }
if ($filtroGrupo) { $whereC[] = 'cv.id_grupo=:grp'; $prmC[':grp'] = $filtroGrupo; }
if ($buscar)  { $whereC[] = "(CONCAT(u.nombres,' ',u.apellidos) LIKE :q OR cv.codigo_qr LIKE :q)"; $prmC[':q']='%'.$buscar.'%'; }
if ($idInst)  { $whereC[] = "g.id_instituto = $idInst"; }

$stCerts = $db->prepare("
    SELECT cv.*,
           CONCAT(u.apellidos,' ',u.nombres)  AS estudiante,
           u.cedula,
           car.nombre                          AS carrera,
           g.nombre_proyecto,
           pa.nombre                           AS periodo,
           g.horas_cumplidas                   AS grupo_horas,
           CONCAT(uf.apellidos,' ',uf.nombres) AS firmado_por_nombre
    FROM certificados_vinculacion cv
    JOIN grupos_vinculacion g  ON g.id_grupo      = cv.id_grupo
    JOIN estudiantes e         ON e.id_estudiante = cv.id_estudiante
    JOIN usuarios u            ON u.id_usuario    = e.id_usuario
    JOIN carreras car          ON car.id_carrera  = e.id_carrera
    LEFT JOIN periodos_academicos pa ON pa.id_periodo = g.id_periodo
    LEFT JOIN usuarios uf      ON uf.id_usuario   = cv.firmado_por
    WHERE " . implode(' AND ', $whereC) . "
    ORDER BY cv.fecha_emision DESC
    LIMIT 200
");
$stCerts->execute($prmC);
$certs = $stCerts->fetchAll();

// ── Pendientes (miembros de grupos completados sin certificado) ──
$sinCertVinc = 0;
foreach ($grupos as $g) {
    $sinCertVinc += max(0, $g['total_miembros'] - $g['ya_certificados']);
}

$tipoLabels = ['culminacion'=>'Culminación','participacion'=>'Participación','horas'=>'Horas'];

// ── Sidebar y HTML ────────────────────────────────────────
$paginaActual   = 'cert_vinculacion';
$sidebarBaseUrl = '.';
?>
<!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-secretaria.css">
<style>
/* ── KPIs ── */
.kpi-card { background:#fff;border:1px solid #e2e8f0;border-radius:12px;
            padding:14px 18px;text-align:center;box-shadow:0 1px 3px rgba(0,0,0,.05);
            border-top:3px solid var(--kc,#10b981); }
.kpi-val  { font-size:28px;font-weight:800;line-height:1; }
.kpi-lbl  { font-size:11px;color:#64748b;margin-top:4px;font-weight:600;
            text-transform:uppercase;letter-spacing:.5px; }
/* ── Cards de grupo ── */
.grupo-card { background:#fff;border:1px solid #e2e8f0;border-radius:12px;
              padding:16px;margin-bottom:12px;transition:border-color .2s;
              box-shadow:0 1px 3px rgba(0,0,0,.04); }
.grupo-card:hover { border-color:#10b981; }
.grupo-card .gc-title { font-weight:700;font-size:14px;color:#0f172a;margin-bottom:4px; }
.grupo-card .gc-meta  { font-size:11px;color:#64748b;display:flex;flex-wrap:wrap;gap:10px; }
.gc-prog-wrap { margin:8px 0 4px; }
.gc-prog-bar  { height:4px;background:#e2e8f0;border-radius:2px;overflow:hidden; }
.gc-prog-fill { height:100%;border-radius:2px;background:#10b981;transition:width .3s; }
/* ── Filtros ── */
.filter-bar { background:#fff;border:1px solid #e2e8f0;border-radius:12px;
              padding:14px 18px;margin-bottom:16px;box-shadow:0 1px 3px rgba(0,0,0,.04); }
/* ── Sección header ── */
.sec-hdr { font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.07em;
           color:#64748b;margin:20px 0 10px;display:flex;align-items:center;gap:8px; }
.sec-hdr span { flex:1;height:1px;background:#e2e8f0; }
/* ── Tabla de miembros ── */
.med-tbl { background:#fff;border:1px solid #e2e8f0;border-radius:10px;overflow:hidden;margin-top:12px; }
.med-tbl table { font-size:12px;margin:0; }
.med-tbl th { background:#f8fafc;font-size:10.5px;text-transform:uppercase;color:#64748b;
              font-weight:700;padding:8px 12px;border-bottom:1px solid #e2e8f0; }
.med-tbl td { padding:8px 12px;vertical-align:middle;border-bottom:1px solid #f1f5f9; }
.med-tbl tr:last-child td { border-bottom:none; }
/* ── Badges ── */
.badge-vigente { background:#f0fdf4;color:#16a34a;border:1px solid #bbf7d0;
                 font-size:10px;padding:2px 8px;border-radius:20px;font-weight:700; }
.badge-anulado { background:#fff1f0;color:#ef4444;border:1px solid #fecaca;
                 font-size:10px;padding:2px 8px;border-radius:20px;font-weight:700; }
.badge-pend    { background:#f8fafc;color:#94a3b8;border:1px solid #e2e8f0;
                 font-size:10px;padding:2px 8px;border-radius:20px;font-weight:600; }
/* ── Tipo card selector ── */
.tipo-card { border:2px solid #e2e8f0;border-radius:10px;padding:10px 14px;
             cursor:pointer;transition:all .2s;font-size:13px;background:#fff; }
.tipo-card:hover { border-color:#10b981; }
</style>
</head>
<body>
<?php include __DIR__ . '/../../includes/navbar.php'; ?>
<div class="app-shell">
<?php include __DIR__ . '/../../includes/sidebar-secretaria.php'; ?>

<main class="main-area">
  <!-- Cabecera -->
  <div class="page-header d-flex justify-content-between align-items-start flex-wrap gap-2">
    <div>
      <h4><i class="fa fa-award me-2" style="color:#10b981;"></i>Certificados de Vinculación</h4>
      <p>Certificados de culminación de prácticas de vinculación con la sociedad
        <span style="color:#94a3b8;">· CES Art.87 / CACES Indicador B3</span>
      </p>
    </div>
  </div>

  <?= flashHtml() ?>

  <!-- KPIs -->
  <div class="row g-3 mb-3">
    <div class="col-6 col-lg-3">
      <div class="kpi-card" style="--kc:#10b981;">
        <div class="kpi-val" style="color:#10b981;"><?= count($grupos) ?></div>
        <div class="kpi-lbl">Grupos completados</div>
      </div>
    </div>
    <div class="col-6 col-lg-3">
      <div class="kpi-card" style="--kc:#f59e0b;">
        <div class="kpi-val" style="color:#f59e0b;"><?= $sinCertVinc ?></div>
        <div class="kpi-lbl">Cert. pendientes</div>
      </div>
    </div>
    <div class="col-6 col-lg-3">
      <div class="kpi-card" style="--kc:#16a34a;">
        <div class="kpi-val" style="color:#16a34a;"><?= count(array_filter($certs, fn($c) => $c['vigente'])) ?></div>
        <div class="kpi-lbl">Emitidos vigentes</div>
      </div>
    </div>
    <div class="col-6 col-lg-3">
      <div class="kpi-card" style="--kc:#8b5cf6;">
        <div class="kpi-val" style="color:#8b5cf6;"><?= count(array_filter($certs, fn($c) => $c['firmado'])) ?></div>
        <div class="kpi-lbl">Firmados</div>
      </div>
    </div>
  </div>

  <!-- Filtros -->
  <div class="filter-bar">
    <form method="GET" class="row g-2 align-items-end">
      <div class="col-12 col-md-4">
        <label style="font-size:11px;font-weight:700;text-transform:uppercase;color:#64748b;display:block;margin-bottom:4px;">Período académico</label>
        <select name="periodo" class="form-select form-select-sm">
          <option value="">Todos los períodos</option>
          <?php foreach ($periodos as $p): ?>
            <option value="<?= $p['id_periodo'] ?>" <?= $filtroPer==$p['id_periodo']?'selected':'' ?>>
              <?= htmlspecialchars($p['nombre']) ?><?= $p['activo'] ? ' ★' : '' ?>
            </option>
          <?php endforeach; ?>
        </select>
      </div>
      <div class="col-12 col-md-4">
        <label style="font-size:11px;font-weight:700;text-transform:uppercase;color:#64748b;display:block;margin-bottom:4px;">Buscar estudiante / código</label>
        <input type="text" name="q" class="form-control form-control-sm"
               placeholder="Nombre, cédula o código" value="<?= htmlspecialchars($buscar) ?>">
      </div>
      <div class="col-6 col-md-2">
        <label style="font-size:11px;font-weight:700;text-transform:uppercase;color:#64748b;display:block;margin-bottom:4px;">Estado cert.</label>
        <select name="vig" class="form-select form-select-sm">
          <option value="todos"   <?= $filtroVig==='todos'   ?'selected':'' ?>>Todos</option>
          <option value="vigentes"<?= $filtroVig==='vigentes'?'selected':'' ?>>Vigentes</option>
          <option value="anulados"<?= $filtroVig==='anulados'?'selected':'' ?>>Anulados</option>
        </select>
      </div>
      <div class="col-6 col-md-2 d-flex gap-2">
        <button type="submit" class="btn btn-primary btn-sm flex-fill">
          <i class="fa fa-filter me-1"></i>Filtrar
        </button>
        <a href="?" class="btn btn-sm btn-outline-secondary"><i class="fa fa-xmark"></i></a>
      </div>
    </form>
  </div>

  <!-- ══ GRUPOS COMPLETADOS ══ -->
  <div class="sec-hdr">
    <i class="fa fa-people-group" style="color:#10b981;"></i>
    Grupos completados — emisión de certificados
    <span></span>
    <span style="font-weight:400;"><?= count($grupos) ?> grupo(s)</span>
  </div>

  <?php if (empty($grupos)): ?>
    <div class="med-tbl"><table class="table mb-0"><tbody>
      <tr><td class="text-center py-5" style="color:#94a3b8;">
        <i class="fa fa-people-group fa-2x d-block mb-2" style="color:#cbd5e1;"></i>
        No hay grupos completados para el período seleccionado.
      </td></tr>
    </tbody></table></div>
  <?php endif; ?>

  <?php foreach ($grupos as $g):
    $pct     = $g['horas_requeridas'] > 0 ? min(100, round($g['horas_cumplidas']/$g['horas_requeridas']*100)) : 0;
    $pending = max(0, $g['total_miembros'] - $g['ya_certificados']);
    $colorPct = $pct >= 100 ? '#16a34a' : '#3b82f6';
  ?>
  <div class="grupo-card">
    <div class="row align-items-start g-2">
      <div class="col-12 col-md-7">
        <div class="gc-title"><?= htmlspecialchars($g['nombre_proyecto']) ?></div>
        <div class="gc-meta">
          <span><i class="fa fa-building me-1"></i><?= htmlspecialchars($g['organizacion'] ?? '—') ?></span>
          <span><i class="fa fa-calendar me-1"></i><?= htmlspecialchars($g['periodo'] ?? '—') ?></span>
          <span><i class="fa fa-users me-1"></i><?= $g['total_miembros'] ?> estudiante(s)</span>
          <?php if ($g['tutor_nombre']): ?>
            <span><i class="fa fa-user-tie me-1"></i>Tutor: <?= htmlspecialchars($g['tutor_nombre']) ?></span>
          <?php endif; ?>
        </div>
        <div class="gc-prog-wrap">
          <div class="gc-prog-bar"><div class="gc-prog-fill" style="width:<?= $pct ?>%;background:<?= $colorPct ?>;"></div></div>
          <div style="font-size:11px;color:#64748b;margin-top:3px;">
            <?= $g['horas_cumplidas'] ?>/<?= $g['horas_requeridas'] ?> h (<?= $pct ?>%)
            <span style="color:<?= $pending>0?'#f59e0b':'#16a34a' ?>;font-weight:600;">
              · <?= $pending > 0 ? "$pending cert. pendiente(s)" : "Todos certificados ✓" ?>
            </span>
          </div>
        </div>
      </div>
      <div class="col-12 col-md-5 d-flex gap-2 flex-wrap justify-content-md-end align-items-center">
        <?php if ($pending > 0): ?>
        <button class="btn btn-sm btn-success" data-bs-toggle="modal"
                data-bs-target="#modalGrupo"
                data-grupo="<?= $g['id_grupo'] ?>"
                data-nombre="<?= htmlspecialchars($g['nombre_proyecto']) ?>"
                data-pending="<?= $pending ?>">
          <i class="fa fa-award me-1"></i>Emitir al grupo (<?= $pending ?>)
        </button>
        <?php endif; ?>
        <button class="btn btn-sm btn-outline-secondary btn-ver-miembros" data-grupo="<?= $g['id_grupo'] ?>">
          <i class="fa fa-list me-1"></i>Ver miembros
        </button>
      </div>
    </div>

    <!-- Tabla de miembros (colapsable) -->
    <div id="miembros-<?= $g['id_grupo'] ?>" style="display:none;margin-top:12px;">
      <?php
        $stMiembros = $db->prepare("
            SELECT m.id_estudiante,
                   CONCAT(u.apellidos,' ',u.nombres) AS nombre,
                   u.cedula, car.nombre AS carrera, m.rol,
                   cv.id_cert_vinc, cv.codigo_qr, cv.vigente, cv.fecha_emision
            FROM miembros_grupo_vinculacion m
            JOIN estudiantes e ON e.id_estudiante = m.id_estudiante
            JOIN usuarios u    ON u.id_usuario    = e.id_usuario
            JOIN carreras car  ON car.id_carrera  = e.id_carrera
            LEFT JOIN certificados_vinculacion cv
                   ON cv.id_grupo = m.id_grupo AND cv.id_estudiante = m.id_estudiante
                   AND cv.tipo = 'culminacion'
            WHERE m.id_grupo = :g AND m.estado = 'activo'
            ORDER BY u.apellidos
        ");
        $stMiembros->execute([':g' => $g['id_grupo']]);
        $miembros = $stMiembros->fetchAll();
      ?>
      <div class="med-tbl">
        <table class="table table-borderless mb-0">
          <thead>
            <tr>
              <th>Estudiante</th>
              <th>Carrera</th>
              <th class="text-center">Rol</th>
              <th class="text-center">Cert. culminación</th>
              <th class="text-center">Acción</th>
            </tr>
          </thead>
          <tbody>
          <?php foreach ($miembros as $m): ?>
            <tr>
              <td>
                <div style="font-weight:600;color:#0f172a;"><?= htmlspecialchars($m['nombre']) ?></div>
                <div style="font-size:10px;color:#94a3b8;font-family:monospace;"><?= htmlspecialchars($m['cedula']) ?></div>
              </td>
              <td style="font-size:11px;color:#64748b;"><?= htmlspecialchars($m['carrera']) ?></td>
              <td class="text-center">
                <?php if ($m['rol'] === 'lider'): ?>
                  <span style="font-size:9px;padding:1px 7px;border-radius:20px;background:#fffbeb;color:#92400e;border:1px solid #fde68a;font-weight:700;">
                    <i class="fa fa-crown me-1" style="font-size:8px;"></i>Líder
                  </span>
                <?php else: ?>
                  <span style="font-size:10px;color:#64748b;">Miembro</span>
                <?php endif; ?>
              </td>
              <td class="text-center">
                <?php if ($m['id_cert_vinc'] && $m['vigente']): ?>
                  <span class="badge-vigente">
                    <i class="fa fa-check me-1"></i><?= date('d/m/Y', strtotime($m['fecha_emision'])) ?>
                  </span>
                  <div style="font-size:10px;color:#94a3b8;font-family:monospace;margin-top:2px;">
                    <?= htmlspecialchars($m['codigo_qr']) ?>
                  </div>
                <?php elseif ($m['id_cert_vinc'] && !$m['vigente']): ?>
                  <span class="badge-anulado">Anulado</span>
                <?php else: ?>
                  <span class="badge-pend">Pendiente</span>
                <?php endif; ?>
              </td>
              <td class="text-center">
                <?php if (!$m['id_cert_vinc'] || !$m['vigente']): ?>
                <form method="POST" style="display:inline;">
                  <input type="hidden" name="emitir" value="1">
                  <input type="hidden" name="id_grupo" value="<?= $g['id_grupo'] ?>">
                  <input type="hidden" name="id_estudiante" value="<?= $m['id_estudiante'] ?>">
                  <input type="hidden" name="tipo" value="culminacion">
                  <button type="submit" class="btn btn-sm btn-outline-success" style="font-size:11px;">
                    <i class="fa fa-award me-1"></i>Emitir
                  </button>
                </form>
                <?php else: ?>
                <div class="d-flex gap-1 justify-content-center">
                  <a href="gen_cert_vinc.php?id=<?= $m['id_cert_vinc'] ?>" target="_blank"
                     class="btn btn-sm btn-success" style="font-size:11px;" title="Descargar PDF">
                    <i class="fa fa-download me-1"></i>PDF
                  </a>
                  <a href="?anular=<?= $m['id_cert_vinc'] ?>"
                     class="btn btn-sm btn-outline-danger" style="font-size:11px;"
                     onclick="return confirm('¿Seguro que desea anular este certificado?')" title="Anular">
                    <i class="fa fa-ban"></i>
                  </a>
                </div>
                <?php endif; ?>
              </td>
            </tr>
          <?php endforeach; ?>
          </tbody>
        </table>
      </div>
    </div>
  </div>
  <?php endforeach; ?>

  <!-- ══ CERTIFICADOS EMITIDOS ══ -->
  <?php if (!empty($certs)): ?>
  <div class="sec-hdr" style="margin-top:24px;">
    <i class="fa fa-certificate" style="color:#10b981;"></i>
    Certificados emitidos
    <span></span>
    <span style="font-weight:400;"><?= count($certs) ?> registro(s)</span>
  </div>
  <div class="med-tbl">
    <table class="table table-borderless mb-0">
      <thead>
        <tr>
          <th>Estudiante</th>
          <th>Proyecto</th>
          <th class="text-center">Tipo</th>
          <th class="text-center">Estado</th>
          <th>Código</th>
          <th class="text-center">Emitido</th>
          <th class="text-center">Firmado</th>
          <th></th>
        </tr>
      </thead>
      <tbody>
      <?php foreach ($certs as $c): ?>
        <tr>
          <td>
            <div style="font-weight:600;color:#0f172a;"><?= htmlspecialchars($c['estudiante']) ?></div>
            <div style="font-size:10px;color:#94a3b8;"><?= htmlspecialchars($c['carrera']) ?></div>
          </td>
          <td style="max-width:180px;font-size:11px;color:#0f172a;">
            <?= htmlspecialchars($c['nombre_proyecto']) ?>
            <div style="color:#94a3b8;font-size:10px;"><?= htmlspecialchars($c['periodo'] ?? '—') ?></div>
          </td>
          <td class="text-center">
            <span style="background:#d1fae5;color:#065f46;border:1px solid #a7f3d0;
                         font-size:10px;padding:2px 8px;border-radius:20px;font-weight:700;">
              <?= $tipoLabels[$c['tipo']] ?? $c['tipo'] ?>
            </span>
          </td>
          <td class="text-center">
            <?php if ($c['vigente']): ?>
              <span class="badge-vigente">Vigente</span>
            <?php else: ?>
              <span class="badge-anulado">Anulado</span>
            <?php endif; ?>
          </td>
          <td style="font-family:monospace;font-size:11px;color:#64748b;">
            <?= htmlspecialchars($c['codigo_qr']) ?>
          </td>
          <td class="text-center" style="font-size:11px;color:#64748b;">
            <?= date('d/m/Y', strtotime($c['fecha_emision'])) ?>
          </td>
          <td class="text-center">
            <?php if ($c['firmado']): ?>
              <a href="<?= BASE_URL ?>/assets/uploads/<?= htmlspecialchars($c['archivo_pdf_firmado']) ?>"
                 target="_blank"
                 style="display:inline-flex;align-items:center;gap:5px;color:#16a34a;font-size:11px;
                        font-weight:700;text-decoration:none;background:#f0fdf4;border:1px solid #bbf7d0;
                        border-radius:6px;padding:3px 10px;"
                 title="Ver PDF firmado">
                <i class="fa fa-circle-check"></i>
                <?= $c['fecha_firma'] ? date('d/m/Y', strtotime($c['fecha_firma'])) : 'Ver' ?>
              </a>
            <?php else: ?>
              <button class="btn btn-sm btn-outline-warning btn-subir-firmado" style="font-size:11px;padding:2px 8px;"
                      data-id="<?= $c['id_cert_vinc'] ?>"
                      data-estudiante="<?= htmlspecialchars($c['estudiante']) ?>">
                <i class="fa fa-upload me-1"></i>Subir
              </button>
            <?php endif; ?>
          </td>
          <td>
            <?php if ($c['vigente']): ?>
            <div class="d-flex gap-1 justify-content-end">
              <a href="gen_cert_vinc.php?id=<?= $c['id_cert_vinc'] ?>" target="_blank"
                 class="btn btn-sm btn-success" style="font-size:11px;" title="Descargar PDF">
                <i class="fa fa-download me-1"></i>PDF
              </a>
              <a href="?anular=<?= $c['id_cert_vinc'] ?>"
                 class="btn btn-sm btn-outline-danger" style="font-size:11px;"
                 onclick="return confirm('¿Anular este certificado?')" title="Anular">
                <i class="fa fa-ban"></i>
              </a>
            </div>
            <?php endif; ?>
          </td>
        </tr>
      <?php endforeach; ?>
      </tbody>
    </table>
  </div>
  <?php endif; ?>

</main>
</div>

<!-- MODAL EMITIR A TODO EL GRUPO -->
<div class="modal fade" id="modalGrupo" tabindex="-1">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title"><i class="fa fa-award me-2" style="color:#10b981;"></i>Emitir certificados al grupo</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
      </div>
      <form method="POST">
        <input type="hidden" name="emitir_grupo" value="1">
        <input type="hidden" name="id_grupo" id="mg-id-grupo">
        <div class="modal-body">
          <p style="font-size:13px;color:#0f172a;">
            Proyecto: <strong id="mg-nombre"></strong><br>
            Se emitirán certificados de culminación a los
            <strong id="mg-pending"></strong> estudiante(s) pendientes.
          </p>
          <div style="font-size:12px;color:#64748b;margin-bottom:8px;font-weight:600;">Tipo:</div>
          <div class="d-flex gap-2">
            <?php foreach (['culminacion'=>'Culminación','participacion'=>'Participación','horas'=>'Horas'] as $v=>$l): ?>
            <label class="tipo-card flex-fill text-center">
              <input type="radio" name="tipo" value="<?= $v ?>" <?= $v==='culminacion'?'checked':'' ?> style="display:none;">
              <div style="font-weight:600;"><?= $l ?></div>
            </label>
            <?php endforeach; ?>
          </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-success"><i class="fa fa-award me-1"></i>Emitir</button>
        </div>
      </form>
    </div>
  </div>
</div>

<!-- MODAL SUBIR PDF FIRMADO -->
<div class="modal fade" id="modalSubirFirmado" tabindex="-1">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title"><i class="fa fa-upload me-2" style="color:#f59e0b;"></i>Subir PDF firmado</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
      </div>
      <form method="POST" enctype="multipart/form-data">
        <input type="hidden" name="subir_firmado" value="1">
        <input type="hidden" name="id_cert_vinc" id="sf-id-cert">
        <div class="modal-body">
          <p style="font-size:13px;">Certificado de: <strong id="sf-estudiante"></strong></p>
          <div id="sfDropZone" style="border:2px dashed #e2e8f0;border-radius:10px;padding:28px;
                                      text-align:center;cursor:pointer;background:#f8fafc;">
            <div style="font-size:26px;margin-bottom:6px;">📄</div>
            <div style="font-size:13px;color:#64748b;" id="sfDropLabel">
              Arrastra el PDF o
              <span style="color:#3b82f6;text-decoration:underline;cursor:pointer;" id="sfClickSpan">haz clic para seleccionar</span>
            </div>
            <div style="font-size:11px;color:#94a3b8;margin-top:4px;">Solo PDF · Máx 15 MB</div>
            <input type="file" name="pdf_firmado" id="sfInput" accept=".pdf" required style="display:none;">
          </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-upload me-1"></i>Subir</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>
$(function(){
  // Toggle miembros
  $('.btn-ver-miembros').on('click', function(){
    var id = $(this).data('grupo');
    $('#miembros-'+id).slideToggle(200);
    $(this).toggleClass('active');
  });
  // Modal grupo
  $('[data-bs-target="#modalGrupo"]').on('click', function(){
    $('#mg-id-grupo').val($(this).data('grupo'));
    $('#mg-nombre').text($(this).data('nombre'));
    $('#mg-pending').text($(this).data('pending'));
  });
  // Tipo cards
  $(document).on('change','input[name="tipo"]', function(){
    $('.tipo-card').css({'border-color':'#e2e8f0','background':'#fff'});
    $(this).closest('.tipo-card').css({'border-color':'#10b981','background':'#f0fdf4'});
  }).find('input[name="tipo"]:checked').trigger('change');
  // Modal subir firmado
  $(document).on('click','.btn-subir-firmado', function(){
    $('#sf-id-cert').val($(this).data('id'));
    $('#sf-estudiante').text($(this).data('estudiante'));
    $('#sfInput').val('');
    new bootstrap.Modal('#modalSubirFirmado').show();
  });
  $('#sfInput').on('change', function(){
    var f = this.files[0];
    if(f) $('#sfDropLabel').html('<strong style="color:#16a34a;">'+f.name+'</strong>');
  });
  $('sfDropZone').on('click', function(e){ if(!$(e.target).is('span')) $('#sfInput').click(); });
  $(document).on('click','#sfClickSpan', function(){ $('#sfInput').click(); });
});
</script>
</body>
</html>