<?php
// Suprimir warning Array to string de instCond()
set_error_handler(function($errno, $errstr) { if (strpos($errstr, "Array to string") !== false) return true; return false; }, E_WARNING);
require_once __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'app.php';
require_once __DIR__ . '/../../config/onedrive.php';
require_once __DIR__ . '/../../includes/OneDriveStorage.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_SECRETARIA);
$idInst = instId();

// ── Asegurar columna archivo_pdf_firmado existe ──────────────
try {
    $db = getDB();
    $db->exec("ALTER TABLE certificados ADD COLUMN IF NOT EXISTS archivo_pdf_firmado VARCHAR(400) DEFAULT NULL");
    $db->exec("ALTER TABLE certificados ADD COLUMN IF NOT EXISTS fecha_firma DATETIME DEFAULT NULL");
} catch(Exception $e) {}

$user      = currentUser();
$db        = getDB();
$pageTitle = 'Certificados';

// ── EMITIR CERTIFICADO ─────────────────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['emitir'])) {
    $idPr  = (int)($_POST['id_practica'] ?? 0);
    $tipo  = in_array($_POST['tipo'] ?? '', ['completado','horas','aprobacion']) ? $_POST['tipo'] : 'completado';

    if ($idPr) {
        // Verificar si ya existe certificado (vigente O anulado)
        $existe = $db->prepare("SELECT id_certificado, vigente FROM certificados WHERE id_practica=:p AND tipo=:t");
        $existe->execute([':p' => $idPr, ':t' => $tipo]);
        $certExistente = $existe->fetch();

        if ($certExistente && $certExistente['vigente'] == 1) {
            // Ya existe un certificado vigente — no emitir duplicado
            flashSet('warn', 'Esta práctica ya tiene un certificado de tipo "' . $tipo . '" vigente.');
        } else {
            // No existe, o existe pero fue anulado — emitir / reemitir
            $codigo   = strtoupper('SIGVP-' . $tipo[0] . '-' . str_pad($idPr, 5, '0', STR_PAD_LEFT) . '-' . substr(uniqid(), -5));
            $urlVerif = BASE_URL . '/verificar_cert.php?codigo=' . $codigo;
            $archivo  = 'certificados/cert_' . $idPr . '_' . $tipo . '_' . time() . '.pdf';

            $db->prepare("
                INSERT INTO certificados
                    (id_practica, tipo, codigo_qr, url_verificacion, archivo_pdf, firmado_por, fecha_emision, vigente)
                VALUES
                    (:p, :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([
                ':p'    => $idPr,
                ':t'    => $tipo,
                ':cod'  => $codigo,
                ':url'  => $urlVerif,
                ':arch' => $archivo,
                ':fp'   => $user['id'],
            ]);
            registrarAudit($user['id'], 'emitir_certificado', 'certificados', $idPr);
            flashSet('ok', 'Certificado emitido. Código: ' . $codigo);
        }
    }
    header('Location: certificados.php'); exit;
}

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

// ── SUBIR PDF FIRMADO ─────────────────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['subir_firmado'])) {
    $idCert = (int)($_POST['id_certificado'] ?? 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 {
        try {
            $nombreArch = 'cert_firmado_' . $idCert . '_' . time() . '.pdf';
            $rutaBD = OneDriveStorage::upload(
                $arch['tmp_name'],
                'certificados',
                $nombreArch,
                (string)$idCert,
                (int)$idInst
            );
            if ($rutaBD) {
                $db->prepare("
                    UPDATE certificados
                    SET    archivo_pdf_firmado = :arch,
                           firmado             = 1,
                           firmado_por         = :fp,
                           fecha_firma         = NOW()
                    WHERE  id_certificado      = :id
                ")->execute([':arch' => $rutaBD, ':fp' => $user['id'], ':id' => $idCert]);
                registrarAudit($user['id'], 'subir_firmado', 'certificados', $idCert);
                flashSet('ok', '✅ PDF firmado subido correctamente.');
            } else {
                flashSet('err', '❌ Error: el archivo no se subió a OneDrive. Intenta nuevamente.');
            }
        } catch (Exception $e) {
            flashSet('err', '❌ Error al subir a OneDrive: ' . $e->getMessage());
        }
    }
    header('Location: certificados.php'); exit;
}

// ── FILTROS ────────────────────────────────────────────────
$filtroTipo    = $_GET['tipo']    ?? 'todos';
$filtroVig     = $_GET['vig']     ?? 'vigentes';
$filtroPeriodo = (int)($_GET['periodo'] ?? 0);
$filtroCarrera = (int)($_GET['carrera'] ?? 0);
$q             = trim($_GET['q']  ?? '');

// Catálogos
$periodos    = $db->query("SELECT id_periodo, nombre, activo FROM periodos_academicos WHERE 1=1" . ($idInst ? " AND id_instituto=$idInst" : "") . " ORDER BY id_periodo DESC")->fetchAll();
$pa          = $db->query("SELECT id_periodo FROM periodos_academicos WHERE 1=1" . ($idInst ? " AND id_instituto=$idInst" : "") . " AND activo=1 LIMIT 1")->fetch();
$idPerActivo = $pa ? $pa['id_periodo'] : ($periodos[0]['id_periodo'] ?? 0);
// Pre-seleccionar período activo si no hay ningún filtro explícito en la URL
if ($filtroPeriodo === 0 && !isset($_GET['periodo'])) $filtroPeriodo = $idPerActivo;
$carreras    = $db->query("SELECT id_carrera, nombre FROM carreras WHERE 1=1" . ($idInst ? " AND id_instituto=$idInst" : "") . " AND activa=1 ORDER BY nombre")->fetchAll();

$where  = ['1=1'];
$params = [];
// Filtro por instituto (multi-tenant)
if ($idInst) { $where[] = "pr.id_instituto = $idInst"; }
if ($filtroTipo   !== 'todos')   { $where[] = 'c.tipo=:tipo';         $params[':tipo'] = $filtroTipo; }
if ($filtroVig    === 'vigentes') { $where[] = 'c.vigente=1'; }
if ($filtroVig    === 'anulados') { $where[] = 'c.vigente=0'; }
if ($filtroPeriodo)               { $where[] = 'pr.id_periodo=:per';   $params[':per']  = $filtroPeriodo; }
if ($filtroCarrera)               { $where[] = 'e.id_carrera=:car';    $params[':car']  = $filtroCarrera; }
if ($q) { $where[] = '(CONCAT(u.nombres," ",u.apellidos) LIKE :q OR c.codigo_qr LIKE :q)'; $params[':q'] = '%'.$q.'%'; }

$certificados = $db->prepare("
    SELECT c.*,
           CONCAT(u.nombres,' ',u.apellidos)   AS estudiante,
           u.cedula,
           car.nombre                           AS carrera,
           COALESCE(em.razon_social, pr.emp_nueva_nombre, '—') AS empresa,
           pe.nombre                            AS periodo,
           pr.horas_cumplidas, pr.nota_final,
           pr.estado                            AS estado_practica,
           c.archivo_pdf_firmado,
           c.fecha_firma,
           CONCAT(uf.nombres,' ',uf.apellidos)  AS firmado_por_nombre
    FROM   certificados c
    JOIN   practicas pr   ON pr.id_practica  = c.id_practica
    JOIN   estudiantes e  ON e.id_estudiante = pr.id_estudiante
    JOIN   usuarios u     ON u.id_usuario    = e.id_usuario
    JOIN   carreras car   ON car.id_carrera  = e.id_carrera
    LEFT JOIN empresas em ON em.id_empresa = pr.id_empresa
    JOIN   periodos_academicos pe ON pe.id_periodo = pr.id_periodo
    LEFT JOIN usuarios uf ON uf.id_usuario   = c.firmado_por
    WHERE  " . implode(' AND ', $where) . "
    ORDER  BY c.fecha_emision DESC
    LIMIT  200
");
$certificados->execute($params);
$certs = $certificados->fetchAll();

// ── Prácticas completadas sin certificado de tipo "completado" ─
$sinCertWhere = ['pr.estado = \'completado\''];
$sinCertParams = [];
if ($idInst)        { $sinCertWhere[] = "pr.id_instituto = $idInst"; }
if ($filtroPeriodo) { $sinCertWhere[] = 'pr.id_periodo = :per2'; $sinCertParams[':per2'] = $filtroPeriodo; }
if ($filtroCarrera) { $sinCertWhere[] = 'e.id_carrera  = :car2'; $sinCertParams[':car2'] = $filtroCarrera; }
$sinCertSQL = implode(' AND ', $sinCertWhere);

$stSinCert = $db->prepare("
    SELECT pr.id_practica,
           CONCAT(u.nombres,' ',u.apellidos) AS estudiante,
           car.nombre AS carrera,
           em.razon_social AS empresa,
           pe.nombre AS periodo,
           pr.horas_cumplidas, pr.nota_final
    FROM   practicas pr
    JOIN   estudiantes e  ON e.id_estudiante = pr.id_estudiante
    JOIN   usuarios u     ON u.id_usuario    = e.id_usuario
    JOIN   carreras car   ON car.id_carrera  = e.id_carrera
    LEFT JOIN empresas em ON em.id_empresa = pr.id_empresa
    JOIN   periodos_academicos pe ON pe.id_periodo = pr.id_periodo
    WHERE  $sinCertSQL
      AND  NOT EXISTS (
               SELECT 1 FROM certificados c
               WHERE c.id_practica = pr.id_practica
                 AND c.tipo = 'completado' AND c.vigente = 1
           )
    ORDER  BY pr.updated_at DESC
");
$stSinCert->execute($sinCertParams);
$sinCert = $stSinCert->fetchAll();

$tipoLabels = ['completado'=>'Completado','horas'=>'Horas','aprobacion'=>'Aprobación'];
$tipoColors = ['completado'=>'#3dffa0','horas'=>'#2ea8ff','aprobacion'=>'#f7b93e'];
?>
<?php $paginaActual = 'certificados'; ?>
<!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.css">
<link rel="stylesheet" href="<?= BASE_URL ?>/assets/css/sidebar-secretaria.css">
</head>
<body>
<?php include __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'navbar.php'; ?>

<div class="app-shell">
  <?php include __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'sidebar-secretaria.php'; ?>

  <main class="main-area">
    <div class="page-header d-flex justify-content-between align-items-start flex-wrap gap-2">
      <div>
        <h4>Gestión de Certificados</h4>
        <p>Emisión, consulta y anulación de certificados de prácticas preprofesionales</p>
      </div>
      <div class="d-flex gap-2">
        <?php if (!empty($sinCert)): ?>
        <button class="btn btn-warning btn-sm" data-bs-toggle="modal" data-bs-target="#modalPendientes">
          <i class="fa fa-exclamation-triangle me-1"></i><?= count($sinCert) ?> sin certificado
        </button>
        <?php endif; ?>
        <button class="btn btn-primary btn-sm" data-bs-toggle="modal" data-bs-target="#modalEmitir">
          <i class="fa fa-plus me-1"></i>Emitir certificado
        </button>
      </div>
    </div>

    <?= flashHtml() ?>

    <!-- ── FILTROS ── -->
    <div style="background:var(--card);border:1px solid var(--border);border-radius:var(--r-lg);padding:14px 18px;margin-bottom:16px;">
      <form method="GET" class="row g-2 align-items-end">

        <!-- Búsqueda -->
        <div class="col-sm-6 col-md-3">
          <label class="form-label">Buscar</label>
          <input type="text" name="q" class="form-control form-control-sm"
                 placeholder="Estudiante o código QR..." value="<?= htmlspecialchars($q) ?>">
        </div>

        <!-- Período -->
        <div class="col-sm-6 col-md-3">
          <label class="form-label">Período</label>
          <select name="periodo" class="form-select form-select-sm">
            <option value="0">— Todos los períodos —</option>
            <?php foreach ($periodos as $p): ?>
            <option value="<?= $p['id_periodo'] ?>" <?= $filtroPeriodo==$p['id_periodo']?'selected':'' ?>>
              <?= htmlspecialchars($p['nombre']) ?><?= $p['activo'] ? ' ★' : '' ?>
            </option>
            <?php endforeach; ?>
          </select>
        </div>

        <!-- Carrera -->
        <div class="col-sm-6 col-md-3">
          <label class="form-label">Carrera</label>
          <select name="carrera" class="form-select form-select-sm">
            <option value="0">— 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>

        <!-- Botones -->
        <div class="col-auto d-flex gap-2">
          <button type="submit" class="btn btn-primary btn-sm"><i class="fa fa-filter me-1"></i>Filtrar</button>
          <a href="certificados.php" class="btn btn-sm btn-outline-secondary"><i class="fa fa-xmark me-1"></i>Limpiar</a>
        </div>
      </form>

      <!-- Segunda fila: tipo + vigencia + indicador -->
      <div class="d-flex gap-2 mt-3 flex-wrap align-items-center">
        <span style="font-size:11px;color:var(--text-2);font-weight:600;text-transform:uppercase;letter-spacing:.05em;">Tipo:</span>
        <div class="btn-group btn-group-sm">
          <?php foreach (['todos'=>'Todos','completado'=>'Completado','horas'=>'Horas','aprobacion'=>'Aprobación'] as $k=>$v): ?>
          <a href="?tipo=<?=$k?>&vig=<?=$filtroVig?>&periodo=<?=$filtroPeriodo?>&carrera=<?=$filtroCarrera?>&q=<?=urlencode($q)?>"
             class="btn <?= $filtroTipo===$k?'btn-primary':'btn-outline-secondary' ?>"><?= $v ?></a>
          <?php endforeach; ?>
        </div>
        <span style="font-size:11px;color:var(--text-2);font-weight:600;text-transform:uppercase;letter-spacing:.05em;margin-left:8px;">Estado:</span>
        <div class="btn-group btn-group-sm">
          <?php foreach (['vigentes'=>'Vigentes','anulados'=>'Anulados','todos'=>'Todos'] as $k=>$v): ?>
          <a href="?tipo=<?=$filtroTipo?>&vig=<?=$k?>&periodo=<?=$filtroPeriodo?>&carrera=<?=$filtroCarrera?>&q=<?=urlencode($q)?>"
             class="btn <?= $filtroVig===$k?'btn-primary':'btn-outline-secondary' ?>"><?= $v ?></a>
          <?php endforeach; ?>
        </div>
        <?php
          $perNom=''; foreach($periodos as $p){ if($p['id_periodo']==$filtroPeriodo){ $perNom=$p['nombre']; break; } }
          $carNom=''; foreach($carreras as $c){ if($c['id_carrera']==$filtroCarrera){ $carNom=$c['nombre']; break; } }
        ?>
        <?php if($filtroPeriodo || $filtroCarrera): ?>
        <span style="font-size:11px;color:var(--text-2);margin-left:8px;">
          <i class="fa fa-filter" style="color:var(--accent);"></i>
          <?php if($filtroPeriodo): ?><strong style="color:var(--text);"><?= htmlspecialchars($perNom) ?></strong><?php endif; ?>
          <?php if($filtroCarrera): ?> · <strong style="color:var(--text);"><?= htmlspecialchars($carNom) ?></strong><?php endif; ?>
        </span>
        <?php endif; ?>
        <span style="margin-left:auto;font-size:12px;color:var(--text-2);"><?= count($certs) ?> resultado(s)</span>
      </div>
    </div>

    <!-- Tabla certificados -->
    <div class="tbl-wrap mb-4" style="overflow:visible;">
      <table class="table table-borderless mb-0">
        <thead>
          <tr>
            <th>Código QR</th>
            <th>Estudiante</th>
            <th>Carrera</th>
            <th>Período</th>
            <th>Tipo</th>
            <th>Horas</th>
            <th>Nota</th>
            <th>Emitido</th>
            <th>Firmado por</th>
            <th>Firmado</th>
            <th>Estado</th>
            <th>Acciones</th>
          </tr>
        </thead>
        <tbody>
          <?php if (empty($certs)): ?>
          <tr>
            <td colspan="11" class="text-center py-5">
              <div style="font-size:28px;margin-bottom:8px;">🏅</div>
              <div style="color:#8b949e;font-size:13px;">Sin certificados <?= $filtroVig === 'vigentes' ? 'vigentes' : '' ?> para los filtros seleccionados.</div>
            </td>
          </tr>
          <?php else: foreach ($certs as $c):
            $color = $tipoColors[$c['tipo']] ?? '#8b949e';
          ?>
          <tr style="<?= !$c['vigente'] ? 'opacity:.5;' : '' ?>">
            <td>
              <code style="font-size:11px;color:#c792ea;background:#c792ea11;
                           border:1px solid #c792ea33;border-radius:4px;padding:2px 6px;">
                <?= htmlspecialchars($c['codigo_qr']) ?>
              </code>
            </td>
            <td>
              <div style="font-size:13px;font-weight:600;"><?= htmlspecialchars($c['estudiante']) ?></div>
              <div style="font-size:10px;color:#8b949e;font-family:monospace;"><?= htmlspecialchars($c['cedula']) ?></div>
            </td>
            <td style="font-size:12px;color:#8b949e;"><?= htmlspecialchars($c['carrera']) ?></td>
            <td style="font-size:11px;color:#8b949e;white-space:nowrap;"><?= htmlspecialchars($c['periodo']) ?></td>
            <td>
              <span style="font-size:11px;padding:2px 9px;border-radius:10px;font-weight:600;
                           background:<?= $color ?>22;color:<?= $color ?>;border:1px solid <?= $color ?>44;">
                <?= $tipoLabels[$c['tipo']] ?? $c['tipo'] ?>
              </span>
            </td>
            <td style="font-weight:700;color:#3dffa0;"><?= $c['horas_cumplidas'] ?>h</td>
            <td>
              <?php if ($c['nota_final']): ?>
                <span style="font-weight:700;color:<?= $c['nota_final']>=7?'#3dffa0':'#f7b93e' ?>;">
                  <?= number_format($c['nota_final'],2) ?>
                </span>
              <?php else: ?>
                <span style="color:#8b949e;">—</span>
              <?php endif; ?>
            </td>
            <td style="font-size:12px;"><?= formatFecha($c['fecha_emision'], 'd/m/Y') ?></td>
            <td style="font-size:12px;color:#8b949e;"><?= htmlspecialchars($c['firmado_por_nombre'] ?? '—') ?></td>
            <td>
              <?php if ($c['archivo_pdf_firmado']): ?>
                <span style="font-size:10px;padding:2px 8px;border-radius:10px;font-weight:700;
                             background:#3dffa022;color:#3dffa0;border:1px solid #3dffa044;">
                  <i class="fa fa-check me-1"></i>Firmado
                </span>
                <div style="font-size:9px;color:#8b949e;margin-top:2px;">
                  <?= $c['fecha_firma'] ? date('d/m/Y', strtotime($c['fecha_firma'])) : '' ?>
                </div>
              <?php else: ?>
                <span style="font-size:10px;padding:2px 8px;border-radius:10px;font-weight:700;
                             background:#f7b93e22;color:#f7b93e;border:1px solid #f7b93e44;">
                  <i class="fa fa-clock me-1"></i>Pendiente
                </span>
              <?php endif; ?>
            </td>
            <td>
              <?php if ($c['vigente']): ?>
                <span class="badge-estado st-aprobado">Vigente</span>
              <?php else: ?>
                <span class="badge-estado st-calificado">Anulado</span>
              <?php endif; ?>
            </td>
            <td>
              <div class="dropdown">
                <button class="btn btn-sm btn-outline-secondary dropdown-toggle"
                        type="button" data-bs-toggle="dropdown" aria-expanded="false"
                        style="font-size:12px;">
                  Acciones
                </button>
                <ul class="dropdown-menu" style="font-size:13px;min-width:210px;z-index:9999;position:absolute;">

                  <?php if ($c['archivo_pdf_firmado']): ?>
                  <!-- Tiene PDF firmado -->
                  <?php
                    if (OneDriveStorage::esOneDrive($c['archivo_pdf_firmado'])) {
                        $urlPdfFirmado = OneDriveStorage::getDownloadUrl($c['archivo_pdf_firmado']);
                    } else {
                        $urlPdfFirmado = BASE_URL . '/assets/uploads/' . ltrim($c['archivo_pdf_firmado'], '/');
                    }
                  ?>
                  <li>
                    <a class="dropdown-item" href="<?= htmlspecialchars($urlPdfFirmado ?? '#') ?>" target="_blank">
                      <i class="fa fa-eye me-2" style="color:#3dffa0;"></i>
                      Ver PDF firmado
                      <?php if ($c['fecha_firma']): ?>
                      <small class="d-block text-muted ms-4" style="font-size:10px;"><?= date('d/m/Y', strtotime($c['fecha_firma'])) ?></small>
                      <?php endif; ?>
                    </a>
                  </li>
                  <?php else: ?>
                  <!-- Sin PDF firmado: ver detalles -->
                  <li>
                    <button class="dropdown-item btn-ver-cert"
                      data-codigo="<?= htmlspecialchars($c['codigo_qr']) ?>"
                      data-tipo="<?= $tipoLabels[$c['tipo']] ?>"
                      data-estudiante="<?= htmlspecialchars($c['estudiante']) ?>"
                      data-cedula="<?= htmlspecialchars($c['cedula']) ?>"
                      data-carrera="<?= htmlspecialchars($c['carrera']) ?>"
                      data-empresa="<?= htmlspecialchars($c['empresa']) ?>"
                      data-periodo="<?= htmlspecialchars($c['periodo']) ?>"
                      data-horas="<?= $c['horas_cumplidas'] ?>"
                      data-nota="<?= $c['nota_final'] ? number_format($c['nota_final'],2) : '—' ?>"
                      data-fecha="<?= formatFecha($c['fecha_emision'], 'd/m/Y H:i') ?>"
                      data-url="<?= htmlspecialchars($c['url_verificacion'] ?? '') ?>"
                      data-firmado="<?= htmlspecialchars($c['firmado_por_nombre'] ?? 'Sin firma') ?>">
                      <i class="fa fa-eye me-2" style="color:#8b949e;"></i>Ver detalles
                    </button>
                  </li>
                  <?php endif; ?>

                  <?php if (!$c['archivo_pdf_firmado'] && $c['vigente']): ?>
                  <li><hr class="dropdown-divider"></li>
                  <li>
                    <button class="dropdown-item btn-subir-firmado"
                            data-id="<?= $c['id_certificado'] ?>"
                            data-estudiante="<?= htmlspecialchars($c['estudiante']) ?>">
                      <i class="fa fa-upload me-2" style="color:#f7b93e;"></i>Subir PDF firmado
                    </button>
                  </li>
                  <?php endif; ?>

                  <li><hr class="dropdown-divider"></li>
                  <li>
                    <a class="dropdown-item" href="<?= BASE_URL ?>/verificar_cert.php?codigo=<?= urlencode($c['codigo_qr']) ?>" target="_blank">
                      <i class="fa fa-qrcode me-2" style="color:#c792ea;"></i>Ver certificado público
                    </a>
                  </li>

                  <?php if ($c['vigente']): ?>
                  <li><hr class="dropdown-divider"></li>
                  <li>
                    <a class="dropdown-item text-danger"
                       href="?anular=<?= $c['id_certificado'] ?>&tipo=<?=$filtroTipo?>&vig=<?=$filtroVig?>&periodo=<?=$filtroPeriodo?>&carrera=<?=$filtroCarrera?>"
                       data-confirm="¿Anular este certificado? Esta acción no se puede deshacer.">
                      <i class="fa fa-ban me-2"></i>Anular certificado
                    </a>
                  </li>
                  <?php endif; ?>

                </ul>
              </div>
            </td>
          </tr>
          <?php endforeach; endif; ?>
        </tbody>
      </table>
    </div>
  </main>
</div>

<!-- ── MODAL EMITIR CERTIFICADO ── -->
<div class="modal fade" id="modalEmitir" tabindex="-1">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title"><i class="fa fa-certificate me-2" style="color:#f7b93e;"></i>Emitir Certificado</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
      </div>
      <form method="POST">
        <input type="hidden" name="emitir" value="1">
        <div class="modal-body">
          <div class="mb-3">
            <label class="form-label">Tipo de certificado</label>
            <div class="d-flex gap-2 flex-wrap" id="tipo-selector">
              <?php foreach ($tipoLabels as $k => $v): ?>
              <label style="flex:1;cursor:pointer;">
                <input type="radio" name="tipo" value="<?= $k ?>" class="d-none tipo-radio" <?= $k==='completado'?'checked':'' ?>>
                <div class="tipo-card" data-tipo="<?= $k ?>"
                     style="border:2px solid <?= $k==='completado'?$tipoColors[$k]:'#30363d' ?>;border-radius:8px;
                            padding:12px;text-align:center;transition:.15s;
                            background:<?= $k==='completado'?$tipoColors[$k].'15':'transparent' ?>;">
                  <div style="font-size:20px;margin-bottom:4px;">
                    <?= $k==='completado'?'🏆':($k==='horas'?'⏱️':'✅') ?>
                  </div>
                  <div style="font-size:12px;font-weight:600;color:<?= $tipoColors[$k] ?>;"><?= $v ?></div>
                </div>
              </label>
              <?php endforeach; ?>
            </div>
          </div>
          <div class="mb-3">
            <label class="form-label">Práctica completada <span style="color:#ff9d93;">*</span></label>
            <select name="id_practica" id="sel-practica" class="form-select" required>
              <option value="">— selecciona una práctica —</option>
              <?php
              $prsResult = $db->query("
                  SELECT pr.id_practica, pr.estado,
                         CONCAT(u.nombres,' ',u.apellidos) AS est,
                         car.nombre AS carrera,
                         COALESCE(em.razon_social, pr.emp_nueva_nombre, '—') AS empresa,
                         pr.horas_cumplidas
                  FROM   practicas pr
                  JOIN   estudiantes e ON e.id_estudiante = pr.id_estudiante
                  JOIN   usuarios u    ON u.id_usuario    = e.id_usuario
                  JOIN   carreras car  ON car.id_carrera  = e.id_carrera
                  LEFT JOIN empresas em ON em.id_empresa = pr.id_empresa
                  WHERE  pr.estado IN ('completado','calificado')
                  " . ($idInst ? "AND pr.id_instituto = $idInst" : "") . "
                  ORDER  BY u.apellidos, u.nombres
              ");
              $prs = $prsResult ? $prsResult->fetchAll() : [];
              foreach ($prs as $p):
              ?>
              <option value="<?= $p['id_practica'] ?>">
                <?= htmlspecialchars($p['est']) ?> — <?= htmlspecialchars($p['carrera']) ?>
                (<?= $p['horas_cumplidas'] ?>h · <?= ucfirst($p['estado']) ?>)
              </option>
              <?php endforeach; ?>
            </select>
          </div>
          <div class="alert-dark-info p-3" style="font-size:12px;">
            <i class="fa fa-info-circle me-2"></i>
            El sistema generará un código QR único. El certificado PDF se puede generar
            desde el detalle del registro.
          </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-certificate me-1"></i>Emitir certificado
          </button>
        </div>
      </form>
    </div>
  </div>
</div>

<!-- ── MODAL VER DETALLE ── -->
<div class="modal fade" id="modalDetalle" tabindex="-1">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">Detalle del certificado</h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
      </div>
      <div class="modal-body">
        <!-- Encabezado estilo certificado -->
        <div style="text-align:center;padding:16px 0 10px;border-bottom:1px solid #30363d;margin-bottom:16px;">
          <div style="font-size:32px;margin-bottom:6px;">🏅</div>
          <div style="font-size:11px;color:#8b949e;letter-spacing:1px;text-transform:uppercase;">Certificado de</div>
          <div id="d-tipo" style="font-size:18px;font-weight:700;color:#3dffa0;"></div>
        </div>
        <div class="row g-3" style="font-size:13px;">
          <div class="col-12">
            <div style="font-size:10px;color:#8b949e;text-transform:uppercase;letter-spacing:.6px;">Estudiante</div>
            <div id="d-est" style="font-weight:700;font-size:15px;"></div>
            <div id="d-ced" style="font-family:monospace;font-size:11px;color:#8b949e;"></div>
          </div>
          <div class="col-6">
            <div style="font-size:10px;color:#8b949e;text-transform:uppercase;letter-spacing:.6px;">Carrera</div>
            <div id="d-car"></div>
          </div>
          <div class="col-6">
            <div style="font-size:10px;color:#8b949e;text-transform:uppercase;letter-spacing:.6px;">Período</div>
            <div id="d-per"></div>
          </div>
          <div class="col-12">
            <div style="font-size:10px;color:#8b949e;text-transform:uppercase;letter-spacing:.6px;">Empresa</div>
            <div id="d-emp"></div>
          </div>
          <div class="col-4">
            <div style="font-size:10px;color:#8b949e;text-transform:uppercase;letter-spacing:.6px;">Horas</div>
            <div id="d-hrs" style="font-weight:700;font-size:18px;color:#2ea8ff;"></div>
          </div>
          <div class="col-4">
            <div style="font-size:10px;color:#8b949e;text-transform:uppercase;letter-spacing:.6px;">Nota final</div>
            <div id="d-not" style="font-weight:700;font-size:18px;"></div>
          </div>
          <div class="col-4">
            <div style="font-size:10px;color:#8b949e;text-transform:uppercase;letter-spacing:.6px;">Emitido</div>
            <div id="d-fec" style="font-size:12px;"></div>
          </div>
          <div class="col-12">
            <div style="font-size:10px;color:#8b949e;text-transform:uppercase;letter-spacing:.6px;">Firmado por</div>
            <div id="d-fir"></div>
          </div>
        </div>
        <!-- Código QR -->
        <div style="margin-top:16px;padding:12px;background:#0d1117;border:1px solid #30363d;
                    border-radius:8px;text-align:center;">
          <div style="font-size:10px;color:#8b949e;letter-spacing:1px;text-transform:uppercase;margin-bottom:6px;">
            Código de verificación
          </div>
          <code id="d-cod" style="font-size:13px;color:#c792ea;word-break:break-all;"></code>
          <div style="margin-top:8px;">
            <a id="d-url" href="#" target="_blank"
               style="font-size:11px;color:#2ea8ff;">
              <i class="fa fa-link me-1"></i>Ver URL de verificación
            </a>
          </div>
        </div>

        <!-- PDF Firmado -->
        <div id="bloque-pdf-firmado" style="margin-top:12px;display:none;">
          <div style="background:#3dffa015;border:1px solid #3dffa044;border-radius:8px;padding:14px;">
            <div style="font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;
                        color:#3dffa0;margin-bottom:10px;">
              <i class="fa fa-file-pdf me-1"></i>PDF Firmado disponible
            </div>
            <div style="font-size:12px;color:#8b949e;margin-bottom:10px;">
              Firmado el <strong id="d-fecha-firma" style="color:#e6edf3;"></strong>
            </div>
            <div class="d-flex gap-2">
              <a id="d-pdf-ver" href="#" target="_blank"
                 class="btn btn-sm"
                 style="background:#ef444420;border:1px solid #ef444455;color:#ef4444;font-weight:700;font-size:12px;">
                <i class="fa fa-file-pdf me-1"></i>Ver PDF firmado
              </a>
              <a id="d-pdf-dl" href="#" download
                 class="btn btn-sm btn-outline-secondary" style="font-size:12px;">
                <i class="fa fa-download me-1"></i>Descargar
              </a>
            </div>
          </div>
        </div>

        <!-- Sin PDF firmado -->
        <div id="bloque-sin-firmado" style="margin-top:12px;">
          <div style="background:#f7b93e15;border:1px solid #f7b93e33;border-radius:8px;
                      padding:12px 14px;font-size:12px;color:#f7b93e;">
            <i class="fa fa-clock me-2"></i>
            Este certificado aún no tiene PDF firmado subido.
            Cierra este panel y usa el botón <i class="fa fa-upload"></i> para subirlo.
          </div>
        </div>

      </div>
    </div>
  </div>
</div>

<!-- ── MODAL PRÁCTICAS SIN CERTIFICADO ── -->
<div class="modal fade" id="modalPendientes" tabindex="-1">
  <div class="modal-dialog modal-lg">
    <div class="modal-content">
      <div class="modal-header">
        <h5 class="modal-title">
          <i class="fa fa-exclamation-triangle me-2" style="color:#f7b93e;"></i>
          Prácticas sin certificado de completado (<?= count($sinCert) ?>)
        </h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
      </div>
      <div class="modal-body p-0">
        <table class="table table-borderless mb-0">
          <thead><tr><th>Estudiante</th><th>Carrera</th><th>Empresa</th><th>Horas</th><th>Nota</th><th></th></tr></thead>
          <tbody>
            <?php foreach ($sinCert as $sc): ?>
            <tr>
              <td style="font-size:13px;font-weight:600;"><?= htmlspecialchars($sc['estudiante']) ?></td>
              <td style="font-size:12px;color:#8b949e;"><?= htmlspecialchars($sc['carrera']) ?></td>
              <td style="font-size:12px;"><?= htmlspecialchars($sc['empresa']) ?></td>
              <td style="color:#3dffa0;font-weight:700;"><?= $sc['horas_cumplidas'] ?>h</td>
              <td>
                <?php if ($sc['nota_final']): ?>
                  <span style="font-weight:700;color:<?= $sc['nota_final']>=7?'#3dffa0':'#f7b93e'?>;">
                    <?= number_format($sc['nota_final'],2) ?>
                  </span>
                <?php else: ?>
                  <span style="color:#8b949e;">—</span>
                <?php endif; ?>
              </td>
              <td>
                <form method="POST" style="display:inline;">
                  <input type="hidden" name="emitir" value="1">
                  <input type="hidden" name="id_practica" value="<?= $sc['id_practica'] ?>">
                  <input type="hidden" name="tipo" value="completado">
                  <button type="submit" class="btn btn-sm btn-success"
                          data-confirm="¿Emitir certificado de completado para <?= htmlspecialchars($sc['estudiante']) ?>?">
                    <i class="fa fa-certificate me-1"></i>Emitir
                  </button>
                </form>
              </td>
            </tr>
            <?php endforeach; ?>
          </tbody>
        </table>
      </div>
    </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:#f7b93e;"></i>Subir PDF Firmado
        </h5>
        <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
      </div>
      <form method="POST" enctype="multipart/form-data" id="formSubirFirmado">
        <input type="hidden" name="subir_firmado" value="1">
        <input type="hidden" name="id_certificado" id="sf-id-cert">
        <div class="modal-body">
          <div class="alert-dark-info p-3 mb-3" style="font-size:12px;">
            <i class="fa fa-info-circle me-2" style="color:#2ea8ff;"></i>
            Certificado de: <strong id="sf-estudiante"></strong><br>
            Sube el PDF ya firmado por las autoridades correspondientes.
            Una vez subido quedará disponible para verificación pública.
          </div>
          <div id="sfDropZone" style="border:2px dashed #30363d;border-radius:10px;padding:28px;
                                      text-align:center;cursor:pointer;background:#0d1117;transition:border-color .2s;">
            <div style="font-size:26px;margin-bottom:6px;">📄</div>
            <div style="font-size:13px;color:#8b949e;" id="sfDropLabel">
              Arrastra el PDF firmado aquí o
              <span style="color:#2ea8ff;text-decoration:underline;cursor:pointer;"
                     id="sfClickSpanInit">haz clic para seleccionar</span>
            </div>
            <div style="font-size:11px;color:#8b949e;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" id="sfBtnEnviar">
            <i class="fa fa-upload me-1"></i>Subir PDF firmado
          </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 () {

  // Selector de tipo visual
  $('.tipo-radio').on('change', function () {
    var t = $(this).val();
    var colors = { completado:'#3dffa0', horas:'#2ea8ff', aprobacion:'#f7b93e' };
    $('.tipo-card').each(function () {
      var me = $(this).data('tipo');
      if (me === t) {
        $(this).css({ borderColor: colors[me], background: colors[me]+'15' });
      } else {
        $(this).css({ borderColor: '#30363d', background: 'transparent' });
      }
    });
  });

  $('.tipo-card').on('click', function () {
    var t = $(this).data('tipo');
    $('input[name="tipo"][value="'+t+'"]').prop('checked', true).trigger('change');
  });

  // Modal ver detalle
  $(document).on('click', '.btn-ver-cert', function () {
    var d = $(this).data();
    $('#d-tipo').text(d.tipo);
    $('#d-est').text(d.estudiante);
    $('#d-ced').text('CI: ' + d.cedula);
    $('#d-car').text(d.carrera);
    $('#d-per').text(d.periodo);
    $('#d-emp').text(d.empresa);
    $('#d-hrs').text(d.horas + ' h');
    $('#d-not').text(d.nota !== '—' ? d.nota : '—')
               .css('color', d.nota !== '—' && parseFloat(d.nota) >= 7 ? '#3dffa0' : '#f7b93e');
    $('#d-fec').text(d.fecha);
    $('#d-fir').text(d.firmado);
    $('#d-cod').text(d.codigo);
    $('#d-url').attr('href', d.url || '#').text(d.url ? 'Ver URL de verificación' : 'Sin URL');

    // PDF firmado
    var pdfFirmado = d.pdfFirmado || '';
    if (pdfFirmado) {
      $('#d-pdf-ver').attr('href', pdfFirmado);
      $('#d-pdf-dl').attr('href', pdfFirmado);
      $('#d-fecha-firma').text(d.fechaFirma || '');
      $('#bloque-pdf-firmado').show();
      $('#bloque-sin-firmado').hide();
    } else {
      $('#bloque-pdf-firmado').hide();
      $('#bloque-sin-firmado').show();
    }

    new bootstrap.Modal('#modalDetalle').show();
  });

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

  // Modal subir firmado
  $(document).on('click', '.btn-subir-firmado', function (e) {
    e.preventDefault();
    var id  = $(this).data('id');
    var est = $(this).data('estudiante');
    $('#sf-id-cert').val(id);
    $('#sf-estudiante').text(est);
    $('#sfDropZone').css('border-color','#30363d');
    $('#sfDropLabel').html('Arrastra el PDF firmado aquí o <span style="color:#2ea8ff;text-decoration:underline;cursor:pointer;" id="sfClickSpan">haz clic para seleccionar</span>');
    $('#sfInput').val('');
    setTimeout(function() {
      bootstrap.Modal.getOrCreateInstance(document.getElementById('modalSubirFirmado')).show();
    }, 150);
  });


  // Drop zone subir firmado
  var $sfDrop  = $('#sfDropZone');
  var $sfInput = $('#sfInput');
  var $sfLabel = $('#sfDropLabel');

  $sfInput.on('change', function () {
    var f = this.files[0];
    if (f) {
      var mb = (f.size/1024/1024).toFixed(2);
      $sfDrop.css('border-color','#3dffa0');
      $sfLabel.html('<strong style="color:#3dffa0;"><i class="fa fa-circle-check me-1"></i>' + f.name + '</strong><br><small style="color:#8b949e;">' + mb + ' MB</small>');
    }
  });

  $sfDrop.on('dragover dragenter', function(e){
    e.preventDefault(); $(this).css('border-color','#2ea8ff');
  }).on('dragleave drop', function(e){
    e.preventDefault();
    if (e.type === 'drop') {
      var f = e.originalEvent.dataTransfer.files[0];
      if (f && f.type === 'application/pdf') {
        var dt = new DataTransfer(); dt.items.add(f);
        $sfInput[0].files = dt.files; $sfInput.trigger('change');
      } else if (f) {
        $sfDrop.css('border-color','#ff9d93');
        $sfLabel.html('<span style="color:#ff9d93;"><i class="fa fa-circle-exclamation me-1"></i>Solo PDF</span>');
      }
    } else { $(this).css('border-color','#30363d'); }
  });

  $sfDrop.on('click', function(e){ if(!$(e.target).is('span')) $sfInput.click(); });
  $(document).on('click', '#sfClickSpanInit, #sfClickSpan', function(){ $('#sfInput').click(); });

  $('#formSubirFirmado').on('submit', function(){
    $('#sfBtnEnviar').prop('disabled',true).html('<i class="fa fa-spinner fa-spin me-1"></i>Subiendo...');
  });

});
</script>
</body>
</html>