<?php
// modules/facturacion/pagos_vinculacion.php
require_once __DIR__ . '/../../config/app.php';
require_once __DIR__ . '/../../includes/auth.php';
require_once __DIR__ . '/../../includes/functions.php';
require_once __DIR__ . '/../../includes/flash.php';
requireRol(ROL_FACTURACION);
$idInst = instId();

$user      = currentUser();
$db        = getDB();
$pageTitle = 'Pagos de Vinculación';

// ── Precio ──────────────────────────────────────────────────
$stCfg = $db->prepare("SELECT valor FROM configuracion_institucional WHERE id_instituto = :id AND clave = 'precio_vinculacion'");
$stCfg->execute([':id' => $idInst]);
$precioVinc = $stCfg->fetchColumn() ?: '0.00';

// ── Parámetros ──────────────────────────────────────────────
$filtroEstado = $_GET['estado'] ?? 'enviada';
$busqueda     = trim($_GET['q'] ?? '');
$idDetalle    = (int)($_GET['id'] ?? 0);
$filtPeriodo = (int)($_GET['periodo'] ?? 0);
$filtCarrera = (int)($_GET['carrera'] ?? 0);
if ($filtPeriodo === 0 && !isset($_GET['periodo'])) {
    $stAct = $db->prepare("SELECT id_periodo FROM periodos_academicos WHERE activo=1 AND id_instituto=:inst ORDER BY fecha_inicio DESC LIMIT 1");
    $stAct->execute([':inst' => $idInst]); $pa = $stAct->fetchColumn();
    if ($pa) $filtPeriodo = (int)$pa;
}
$stPer = $db->prepare("SELECT id_periodo, nombre, activo FROM periodos_academicos WHERE id_instituto=:inst ORDER BY activo DESC, fecha_inicio DESC");
$stPer->execute([':inst' => $idInst]); $listaPeriodos = $stPer->fetchAll();
$stCar = $db->prepare("SELECT id_carrera, nombre FROM carreras WHERE id_instituto=:inst AND activa=1 ORDER BY nombre");
$stCar->execute([':inst' => $idInst]); $listaCarreras = $stCar->fetchAll();


// ── POST: Aprobar o rechazar ─────────────────────────────────
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $accion      = $_POST['accion'] ?? '';
    $idGrupo     = (int)($_POST['id_grupo'] ?? 0);
    $observacion = trim($_POST['observaciones'] ?? '');

    // IDs de estudiantes marcados como exonerados individualmente
    $miembrosExonerados = array_map('intval', (array)($_POST['exonerado_miembro'] ?? []));

    if ($idGrupo && in_array($accion, ['aprobar','rechazar'])) {
        if ($accion === 'rechazar' && empty($observacion)) {
            flashSet('err', 'Debes indicar el motivo del rechazo.');
            header('Location: pagos_vinculacion.php?id='.$idGrupo); exit;
        }

        $nuevoEstado = $accion === 'aprobar' ? 'aprobado' : 'rechazado';
        $instCheck   = $idInst ? "AND id_instituto = $idInst" : '';

        // Actualizar exoneración individual por miembro (solo al aprobar)
        $esExoneradoGrupo = 0;
        if ($accion === 'aprobar') {
            try {
                $stTodosM = $db->prepare("SELECT id_estudiante FROM miembros_grupo_vinculacion WHERE id_grupo = :g AND estado = 'activo'");
                $stTodosM->execute([':g' => $idGrupo]);
                $todosIds = $stTodosM->fetchAll(PDO::FETCH_COLUMN);

                $stUpdM = $db->prepare("UPDATE miembros_grupo_vinculacion SET exonerado = :ex WHERE id_grupo = :g AND id_estudiante = :e");
                foreach ($todosIds as $idEstM) {
                    $stUpdM->execute([
                        ':ex' => in_array($idEstM, $miembrosExonerados) ? 1 : 0,
                        ':g'  => $idGrupo,
                        ':e'  => $idEstM,
                    ]);
                }
                // Grupo exonerado = 1 solo si TODOS están exonerados
                $esExoneradoGrupo = (!empty($todosIds) && count($miembrosExonerados) >= count($todosIds)) ? 1 : 0;
            } catch (Exception $exM) { /* columna puede no existir aún */ }
        }

        $db->prepare("
            UPDATE grupos_vinculacion
            SET estado_pago = :ep,
                exonerado   = :ex,
                obs_pago    = :o,
                updated_at  = NOW()
            WHERE id_grupo = :id
              AND estado_pago = 'enviada'
              $instCheck
        ")->execute([':ep'=>$nuevoEstado,':ex'=>$esExoneradoGrupo,':o'=>$observacion,':id'=>$idGrupo]);

        // Notificar al líder
        try {
            $stLider = $db->prepare("SELECT e.id_usuario FROM grupos_vinculacion gv JOIN estudiantes e ON e.id_estudiante=gv.id_lider WHERE gv.id_grupo=:id");
            $stLider->execute([':id'=>$idGrupo]);
            $idUsrLider = $stLider->fetchColumn();
            if ($idUsrLider) {
                $db->prepare("INSERT INTO notificaciones (id_usuario,asunto,mensaje,leida,created_at) VALUES (:u,:a,:m,0,NOW())")->execute([
                    ':u' => $idUsrLider,
                    ':a' => $accion === 'aprobar' ? '✅ Pago de vinculación validado' : '❌ Comprobante de vinculación rechazado',
                    ':m' => $accion === 'aprobar'
                        ? 'El comprobante de pago de Vinculación de tu grupo fue validado. Ya pueden continuar.'
                        : 'El comprobante de vinculación fue rechazado. Motivo: '.$observacion,
                ]);
            }
        } catch (Exception $e) {}

        flashSet('ok', $accion === 'aprobar' ? '✅ Pago validado.' : '❌ Solicitud rechazada.');
        header('Location: pagos_vinculacion.php'); exit;
    }
}

// ── Conteos ──────────────────────────────────────────────────
$conteos = [];
$instCondC = $idInst ? "AND id_instituto = $idInst" : '';
$stC = $db->query("
    SELECT estado_pago AS estado, COUNT(*) AS n
    FROM grupos_vinculacion
    WHERE estado_pago IN ('enviada','aprobado','rechazado') $instCondC
    GROUP BY estado_pago
");
foreach ($stC->fetchAll() as $row) $conteos[$row['estado']] = (int)$row['n'];

$estadoLabel = [
    'pendiente' => ['txt'=>'Sin enviar',          'bg'=>'#f8fafc','color'=>'#94a3b8','border'=>'#e2e8f0'],
    'enviada'   => ['txt'=>'Esperando validación', 'bg'=>'#eff6ff','color'=>'#1e40af','border'=>'#93c5fd'],
    'aprobado'  => ['txt'=>'Pago validado',        'bg'=>'#f0fdf4','color'=>'#065f46','border'=>'#86efac'],
    'rechazado' => ['txt'=>'Rechazado',            'bg'=>'#fef2f2','color'=>'#991b1b','border'=>'#fca5a5'],
];

// ── Detalle ──────────────────────────────────────────────────
$detalle = null;
if ($idDetalle) {
    $instCondD = $idInst ? "AND gv.id_instituto = $idInst" : '';
    $st = $db->prepare("
        SELECT gv.*,
               CONCAT(ul.nombres,' ',ul.apellidos) AS lider_nombre,
               ul.email AS lider_email, ul.cedula AS lider_cedula,
               car.nombre AS carrera,
               el.codigo_estudiante,
               COALESCE(ob.nombre, gv.org_nueva_nombre) AS organizacion,
               pe.nombre AS periodo_nombre
        FROM   grupos_vinculacion gv
        JOIN   estudiantes el  ON el.id_estudiante = gv.id_lider
        JOIN   usuarios    ul  ON ul.id_usuario    = el.id_usuario
        JOIN   carreras    car ON car.id_carrera   = el.id_carrera
        LEFT JOIN organizaciones_beneficiarias ob ON ob.id_organizacion = gv.id_organizacion
        LEFT JOIN periodos_academicos pe ON pe.id_periodo = gv.id_periodo
        WHERE  gv.id_grupo = :id $instCondD
    ");
    $st->execute([':id' => $idDetalle]);
    $detalle = $st->fetch() ?: null;
}

// ── Miembros del grupo (para detalle) ───────────────────────
$miembrosDetalle = [];
if ($idDetalle && $detalle) {
    try {
        $stM = $db->prepare("
            SELECT m.id_estudiante, m.rol,
                   IFNULL(m.exonerado, 0) AS exonerado,
                   CONCAT(u.apellidos,' ',u.nombres) AS nombre_completo,
                   u.cedula
            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
            WHERE  m.id_grupo = :g AND m.estado = 'activo'
            ORDER BY m.rol DESC, u.apellidos
        ");
        $stM->execute([':g' => $idDetalle]);
        $miembrosDetalle = $stM->fetchAll();
    } catch (Exception $ex) { $miembrosDetalle = []; }
}
$solicitudes = [];
if (!$idDetalle) {
    $conds  = ["gv.estado_pago != 'pendiente'"];
    $params = [];
    if ($idInst) $conds[] = "gv.id_instituto = $idInst";
    if ($filtroEstado !== 'todos') { $conds[] = 'gv.estado_pago = :est'; $params[':est'] = $filtroEstado; }
    if ($filtPeriodo)   { $conds[] = 'gv.id_periodo = :per';   $params[':per'] = $filtPeriodo; }
    if ($filtCarrera)   { $conds[] = 'car.id_carrera = :car';   $params[':car'] = $filtCarrera; }
    if ($busqueda !== '') {
        $conds[] = "CONCAT(ul.nombres,' ',ul.apellidos,' ',ul.cedula,' ',car.nombre) LIKE :q";
        $params[':q'] = '%'.$busqueda.'%';
    }
    $where = 'WHERE ' . implode(' AND ', $conds);
    $st = $db->prepare("
        SELECT gv.id_grupo, gv.nombre_proyecto, gv.estado_pago, gv.exonerado, gv.comprobante_pago, gv.created_at,
               CONCAT(ul.nombres,' ',ul.apellidos) AS lider_nombre,
               ul.cedula AS lider_cedula, car.nombre AS carrera,
               COALESCE(ob.nombre, gv.org_nueva_nombre) AS organizacion
        FROM   grupos_vinculacion gv
        JOIN   estudiantes el  ON el.id_estudiante = gv.id_lider
        JOIN   usuarios    ul  ON ul.id_usuario    = el.id_usuario
        JOIN   carreras    car ON car.id_carrera   = el.id_carrera
        LEFT JOIN organizaciones_beneficiarias ob ON ob.id_organizacion = gv.id_organizacion
        $where
        ORDER BY FIELD(gv.estado_pago,'enviada','rechazado','pendiente','aprobado'), gv.created_at ASC
    ");
    $st->execute($params);
    $solicitudes = $st->fetchAll();
}
?>
<!DOCTYPE html>
<html lang="es">
<head>
<?php include __DIR__ . '/../../includes/head.php'; ?>
<link rel="stylesheet" href="<?= BASE_URL ?>/assets/css/sidebar-facturacion.css">
<style>
.sec{background:#fff;border:1px solid #e2e8f0;border-radius:14px;padding:1.4rem 1.5rem;box-shadow:0 1px 4px rgba(0,0,0,.04);}
.est-badge{display:inline-flex;align-items:center;gap:5px;padding:3px 11px;border-radius:999px;font-size:11px;font-weight:600;}
.tab-btn{background:none;border:none;padding:8px 16px;font-size:13px;font-weight:500;color:#64748b;border-bottom:2px solid transparent;cursor:pointer;transition:all .15s;text-decoration:none;display:inline-block;}
.tab-btn.active{color:#059669;border-bottom-color:#059669;font-weight:700;}
.comp-thumb{width:100%;max-height:320px;object-fit:contain;border-radius:10px;border:1px solid #e2e8f0;}
.comp-pdf-big{background:#fef2f2;border:1px solid #fecaca;border-radius:12px;padding:2rem;text-align:center;}
.action-card{background:#f8fafc;border:1px solid #e2e8f0;border-radius:10px;padding:1rem 1.25rem;}
.th-label{font-size:10px;letter-spacing:.8px;text-transform:uppercase;color:#94a3b8;padding:10px 16px;font-weight:700;}
.exon-badge{display:inline-flex;align-items:center;gap:4px;background:#fef3c7;color:#92400e;border:1px solid #fde68a;border-radius:6px;padding:2px 8px;font-size:11px;font-weight:700;}
.chk-exon{display:flex;align-items:center;gap:10px;background:#fffbeb;border:1px solid #fde68a;border-radius:10px;padding:12px 14px;margin-bottom:14px;cursor:pointer;}
.chk-exon input[type=checkbox]{width:18px;height:18px;accent-color:#d97706;cursor:pointer;}
.chk-exon-lbl{font-size:13px;font-weight:600;color:#92400e;cursor:pointer;user-select:none;}
</style>
</head>
<body>
<?php include __DIR__ . '/../../includes/navbar.php'; ?>
<div class="app-shell">
  <?php $sbActivo = 'pagos_vinculacion'; include __DIR__ . '/../../includes/sidebar_facturacion.php'; ?>

  <main class="main-area">
    <?= flashHtml() ?>

    <?php if ($detalle): ?>
    <!-- ══ DETALLE ══ -->
    <div class="page-header d-flex justify-content-between align-items-center flex-wrap gap-2">
      <div>
        <h4><i class="fa fa-file-invoice-dollar me-2" style="color:#059669;"></i>Validar Comprobante — Vinculación</h4>
        <p style="color:#64748b;">Revisa el documento y aprueba o rechaza el pago del grupo</p>
      </div>
      <a href="pagos_vinculacion.php" class="btn btn-outline-secondary btn-sm">
        <i class="fa fa-arrow-left me-1"></i>Volver a lista
      </a>
    </div>

    <div class="row g-3">
      <div class="col-lg-7">
        <div class="sec mb-3">
          <p style="font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:#94a3b8;margin-bottom:10px;">Datos del grupo</p>
          <div style="font-size:1.05rem;font-weight:700;color:#0f172a;"><?= htmlspecialchars($detalle['nombre_proyecto']) ?></div>
          <div style="font-size:12px;color:#64748b;margin-bottom:14px;"><?= htmlspecialchars($detalle['carrera']) ?> · Período: <?= htmlspecialchars($detalle['periodo_nombre'] ?? '—') ?></div>
          <div class="row g-2" style="font-size:12px;">
            <div class="col-sm-6"><div style="color:#94a3b8;margin-bottom:2px;">Líder del grupo</div><div style="font-weight:600;"><?= htmlspecialchars($detalle['lider_nombre']) ?></div></div>
            <div class="col-sm-6"><div style="color:#94a3b8;margin-bottom:2px;">Organización</div><div style="font-weight:600;"><?= htmlspecialchars($detalle['organizacion'] ?? '—') ?></div></div>
            <div class="col-sm-6 mt-2"><div style="color:#94a3b8;margin-bottom:2px;">Cédula líder</div><div style="font-weight:600;"><?= htmlspecialchars($detalle['lider_cedula'] ?? '—') ?></div></div>
            <div class="col-sm-6 mt-2"><div style="color:#94a3b8;margin-bottom:2px;">Fecha envío</div><div style="font-weight:600;"><?= date('d/m/Y H:i', strtotime($detalle['created_at'])) ?></div></div>
          </div>
        </div>

        <!-- ══ TABLA DE INTEGRANTES CON PAGO INDIVIDUAL ══ -->
        <?php if (!empty($miembrosDetalle)): ?>
        <div class="sec mb-3">
          <p style="font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:#94a3b8;margin-bottom:12px;">
            <i class="fa fa-users me-1"></i>Integrantes — Pago individual
          </p>
          <div style="overflow-x:auto;">
            <table class="table table-borderless mb-0" style="font-size:13px;">
              <thead style="background:#f8fafc;">
                <tr>
                  <th style="font-size:10px;color:#94a3b8;font-weight:700;padding:8px 10px;">Integrante</th>
                  <th style="font-size:10px;color:#94a3b8;font-weight:700;padding:8px 10px;">Cédula</th>
                  <th style="font-size:10px;color:#94a3b8;font-weight:700;padding:8px 10px;text-align:center;">Valor</th>
                  <th style="font-size:10px;color:#94a3b8;font-weight:700;padding:8px 10px;text-align:center;">Exonerado</th>
                  <th style="font-size:10px;color:#94a3b8;font-weight:700;padding:8px 10px;text-align:right;">Subtotal</th>
                </tr>
              </thead>
              <tbody>
                <?php foreach ($miembrosDetalle as $mb): ?>
                <tr style="border-bottom:1px solid #f1f5f9;" id="row-<?= $mb['id_estudiante'] ?>">
                  <td style="padding:8px 10px;vertical-align:middle;">
                    <?php if ($mb['rol'] === 'lider'): ?>
                      <i class="fa fa-crown" style="color:#d97706;font-size:11px;margin-right:4px;"></i>
                    <?php endif; ?>
                    <span style="font-weight:<?= $mb['rol']==='lider'?'700':'500' ?>;color:#0f172a;">
                      <?= htmlspecialchars($mb['nombre_completo']) ?>
                    </span>
                  </td>
                  <td style="padding:8px 10px;vertical-align:middle;color:#475569;font-family:monospace;">
                    <?= htmlspecialchars($mb['cedula'] ?? '—') ?>
                  </td>
                  <td style="padding:8px 10px;vertical-align:middle;text-align:center;color:#475569;">
                    $<?= $precioVinc ?>
                  </td>
                  <td style="padding:8px 10px;vertical-align:middle;text-align:center;">
                    <?php if ($detalle['estado_pago'] === 'enviada'): ?>
                      <input type="checkbox"
                             class="chk-exon-ind"
                             data-est="<?= $mb['id_estudiante'] ?>"
                             data-precio="<?= $precioVinc ?>"
                             <?= $mb['exonerado'] ? 'checked' : '' ?>
                             style="width:17px;height:17px;accent-color:#d97706;cursor:pointer;">
                    <?php else: ?>
                      <?php if ($mb['exonerado']): ?>
                        <span class="exon-badge"><i class="fa fa-star"></i>Sí</span>
                      <?php else: ?>
                        <span style="color:#94a3b8;font-size:12px;">—</span>
                      <?php endif; ?>
                    <?php endif; ?>
                  </td>
                  <td style="padding:8px 10px;vertical-align:middle;text-align:right;font-weight:700;" class="td-subtotal">
                    <?php if ($mb['exonerado']): ?>
                      <span style="color:#d97706;">$0.00</span>
                    <?php else: ?>
                      <span style="color:#059669;">$<?= $precioVinc ?></span>
                    <?php endif; ?>
                  </td>
                </tr>
                <?php endforeach; ?>
              </tbody>
              <tfoot>
                <tr style="background:#f0fdf4;border-top:2px solid #86efac;">
                  <td colspan="4" style="padding:10px;font-size:13px;color:#065f46;font-weight:700;text-align:right;">
                    <span id="resumen-exon" style="font-size:11px;color:#94a3b8;margin-right:10px;font-weight:400;"></span>
                    Total a pagar:
                  </td>
                  <td style="padding:10px;font-size:16px;font-weight:800;color:#059669;text-align:right;" id="td-total">
                    $<?= number_format(array_sum(array_map(fn($m) => $m['exonerado'] ? 0 : (float)$precioVinc, $miembrosDetalle)), 2) ?>
                  </td>
                </tr>
              </tfoot>
            </table>
          </div>
          <?php if ($detalle['estado_pago'] === 'enviada'): ?>
          <div style="font-size:11px;color:#94a3b8;margin-top:8px;"><i class="fa fa-circle-info me-1"></i>Marca el checkbox de un integrante para exonerarlo ($0.00). El total se actualiza automáticamente.</div>
          <?php endif; ?>
        </div>
        <?php endif; ?>
        <!-- fin tabla integrantes -->

        <div class="sec">
          <p style="font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:#94a3b8;margin-bottom:12px;">
            <?= $detalle['exonerado'] ? '📄 Documento de exoneración' : "Comprobante de pago — $$precioVinc" ?>
          </p>
          <?php if (!empty($detalle['comprobante_pago'])): ?>
            <?php
            $ext = strtolower(pathinfo($detalle['comprobante_pago'], PATHINFO_EXTENSION));
            $url = BASE_URL . '/assets/uploads/comprobantes_vinculacion/' . rawurlencode($detalle['comprobante_pago']);
            ?>
            <?php if (in_array($ext, ['jpg','jpeg','png'])): ?>
              <img src="<?= $url ?>" alt="Comprobante" class="comp-thumb mb-2">
            <?php else: ?>
              <div class="comp-pdf-big mb-2">
                <i class="fa fa-file-pdf" style="font-size:3rem;color:#dc2626;display:block;margin-bottom:.5rem;"></i>
                <div style="font-weight:600;color:#991b1b;"><?= htmlspecialchars(basename($detalle['comprobante_pago'])) ?></div>
              </div>
            <?php endif; ?>
            <a href="<?= $url ?>" target="_blank" class="btn btn-outline-secondary btn-sm w-100">
              <i class="fa fa-eye me-1"></i>Ver / descargar documento
            </a>
          <?php else: ?>
            <div style="background:#fef2f2;border:1px solid #fecaca;border-radius:10px;padding:1rem;color:#991b1b;font-size:13px;text-align:center;">
              <i class="fa fa-triangle-exclamation me-2"></i>El grupo no adjuntó documento.
            </div>
          <?php endif; ?>
        </div>
      </div>

      <div class="col-lg-5">
        <?php if ($detalle['estado_pago'] === 'enviada'): ?>
        <div class="sec">
          <p style="font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:#94a3b8;margin-bottom:16px;">Acción de validación</p>

          <div class="action-card mb-3" style="border-color:#bbf7d0;background:#f0fdf4;">
            <div style="font-weight:700;color:#065f46;margin-bottom:8px;"><i class="fa fa-circle-check me-2" style="color:#059669;"></i>Validar pago</div>
            <form method="POST" onsubmit="return confirmarAprobacion()">
              <input type="hidden" name="accion" value="aprobar">
              <input type="hidden" name="id_grupo" value="<?= $detalle['id_grupo'] ?>">
              <!-- Los hidden de exonerados individuales se inyectan por JS desde la tabla -->
              <div id="hidden-exon-container"></div>
              <p style="font-size:12px;color:#059669;margin-bottom:10px;" id="msg-pago-resumen">
                <?php
                  $totalInicial = array_sum(array_map(fn($m) => $m['exonerado'] ? 0 : (float)$precioVinc, $miembrosDetalle));
                  echo $totalInicial == 0
                    ? 'Todos exonerados de pago ($0.00).'
                    : "Pago de <strong>$".number_format($totalInicial,2)."</strong> recibido correctamente.";
                ?>
              </p>
              <input type="text" name="observaciones" class="form-control form-control-sm mb-2"
                     placeholder="N° recibo o nota opcional..." style="font-size:12px;border-color:#a7f3d0;">
              <button type="submit" class="btn btn-success w-100"><i class="fa fa-check me-2"></i>Aprobar</button>
            </form>
          </div>

          <div class="action-card" style="border-color:#fecaca;background:#fef2f2;">
            <div style="font-weight:700;color:#991b1b;margin-bottom:6px;"><i class="fa fa-circle-xmark me-2" style="color:#dc2626;"></i>Rechazar comprobante</div>
            <form method="POST" onsubmit="return confirm('¿Seguro que deseas rechazar?')">
              <input type="hidden" name="accion" value="rechazar">
              <input type="hidden" name="id_grupo" value="<?= $detalle['id_grupo'] ?>">
              <textarea name="observaciones" class="form-control form-control-sm mb-2" rows="2" required
                        placeholder="Motivo del rechazo (obligatorio)..." style="font-size:12px;border-color:#fca5a5;"></textarea>
              <button type="submit" class="btn btn-danger w-100"><i class="fa fa-xmark me-2"></i>Rechazar solicitud</button>
            </form>
          </div>
        </div>

        <?php else: ?>
        <div class="sec">
          <?php $e = $estadoLabel[$detalle['estado_pago']] ?? $estadoLabel['pendiente']; ?>
          <p style="font-size:10px;font-weight:700;letter-spacing:1px;text-transform:uppercase;color:#94a3b8;margin-bottom:12px;">Estado del comprobante</p>
          <div style="background:<?= $e['bg'] ?>;border:1px solid <?= $e['border'] ?>;border-radius:10px;padding:1rem 1.25rem;margin-bottom:12px;">
            <div style="font-weight:700;color:<?= $e['color'] ?>;font-size:.95rem;"><?= $e['txt'] ?></div>
            <?php if (!empty($detalle['obs_pago'])): ?>
              <div style="font-size:12px;color:<?= $e['color'] ?>;margin-top:6px;opacity:.85;"><?= htmlspecialchars($detalle['obs_pago']) ?></div>
            <?php endif; ?>
          </div>
          <?php if ($detalle['exonerado']): ?><div class="mt-2"><span class="exon-badge"><i class="fa fa-star"></i>EXONERADO — $0.00</span></div><?php endif; ?>
          <div style="font-size:12px;color:#64748b;text-align:center;margin-top:10px;"><i class="fa fa-clock me-1"></i>Procesado el <?= date('d/m/Y H:i', strtotime($detalle['updated_at'])) ?></div>
        </div>
        <?php endif; ?>
      </div>
    </div>

    <?php else: ?>
    <div class="page-header">
      <h4><i class="fa fa-money-check-dollar me-2" style="color:#059669;"></i>Pagos — Vinculación</h4>
      <p style="color:#64748b;">Precio configurado: <strong>$<?= htmlspecialchars($precioVinc) ?></strong></p>
    </div>

    <form method="GET" class="mb-3" id="form-filtros">
      <input type="hidden" name="estado" value="<?= htmlspecialchars($filtroEstado) ?>">
      <div class="d-flex gap-2 flex-wrap align-items-end">
        <div>
          <label style="font-size:10px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:#94a3b8;display:block;margin-bottom:3px;"><i class="fa fa-search me-1"></i>Buscar</label>
          <input type="text" name="q" class="form-control form-control-sm" style="min-width:230px;" placeholder="Nombre, cédula o carrera..." value="<?= htmlspecialchars($busqueda) ?>">
        </div>
        <div>
          <label style="font-size:10px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:#94a3b8;display:block;margin-bottom:3px;"><i class="fa fa-calendar me-1"></i>Período</label>
          <select name="periodo" class="form-select form-select-sm" style="min-width:160px;" onchange="this.form.submit()">
            <option value="0">— Todos —</option>
            <?php foreach($listaPeriodos as $lp): ?>
              <option value="<?= $lp['id_periodo'] ?>" <?= $filtPeriodo===$lp['id_periodo']?'selected':'' ?>>
                <?= !empty($lp['activo'])?'🟢 ':'' ?><?= htmlspecialchars($lp['nombre']) ?><?= !empty($lp['activo'])?' (activo)':'' ?>
              </option>
            <?php endforeach; ?>
          </select>
        </div>
        <div>
          <label style="font-size:10px;font-weight:700;letter-spacing:.6px;text-transform:uppercase;color:#94a3b8;display:block;margin-bottom:3px;"><i class="fa fa-graduation-cap me-1"></i>Carrera</label>
          <select name="carrera" class="form-select form-select-sm" style="min-width:155px;" onchange="this.form.submit()">
            <option value="0">— Todas —</option>
            <?php foreach($listaCarreras as $lc): ?>
              <option value="<?= $lc['id_carrera'] ?>" <?= $filtCarrera===$lc['id_carrera']?'selected':'' ?>><?= htmlspecialchars($lc['nombre']) ?></option>
            <?php endforeach; ?>
          </select>
        </div>
        <div class="d-flex gap-1 align-items-end">
          <button type="submit" class="btn btn-outline-secondary btn-sm"><i class="fa fa-search me-1"></i>Buscar</button>
          <?php if($busqueda||$filtPeriodo||$filtCarrera): ?>
            <a href="pagos_vinculacion.php?estado=<?= $filtroEstado ?>" class="btn btn-outline-secondary btn-sm"><i class="fa fa-xmark"></i></a>
          <?php endif; ?>
        </div>
      </div>
      <?php if($busqueda||$filtPeriodo||$filtCarrera): ?>
      <div class="d-flex align-items-center gap-2 mt-2 flex-wrap" style="font-size:11px;">
        <span style="color:#94a3b8;">Filtros:</span>
        <?php if($busqueda): ?><span class="badge bg-info-subtle text-info-emphasis border border-info-subtle">"<?= htmlspecialchars($busqueda) ?>"</span><?php endif; ?>
        <?php if($filtPeriodo): $pN='';$pA=false;foreach($listaPeriodos as $lp) if($lp['id_periodo']==$filtPeriodo){$pN=$lp['nombre'];$pA=!empty($lp['activo']);} ?>
          <span class="badge bg-success-subtle text-success-emphasis border border-success-subtle"><?= $pA?'🟢':'📅' ?> <?= htmlspecialchars($pN) ?></span>
        <?php endif; ?>
        <?php if($filtCarrera): $cN='';foreach($listaCarreras as $lc) if($lc['id_carrera']==$filtCarrera) $cN=$lc['nombre']; ?>
          <span class="badge bg-primary-subtle text-primary-emphasis border border-primary-subtle">🎓 <?= htmlspecialchars($cN) ?></span>
        <?php endif; ?>
      </div>
      <?php endif; ?>
    </form>

    <div style="border-bottom:2px solid #e2e8f0;margin-bottom:1rem;">
      <?php foreach (['enviada'=>'⏳ Pendientes','aprobado'=>'✅ Aprobados','rechazado'=>'❌ Rechazados','todos'=>'📋 Todos'] as $k=>$v): ?>
        <a href="pagos_vinculacion.php?estado=<?= $k ?>&periodo=<?= $filtPeriodo ?>&carrera=<?= $filtCarrera ?>" class="tab-btn <?= $filtroEstado===$k?'active':'' ?>">
          <?= $v ?>
          <?php $cnt = $conteos[$k] ?? 0; if ($cnt > 0 && $k !== 'todos'): ?>
            <span style="background:<?= $k==='enviada'?'#dc2626':($k==='aprobado'?'#059669':'#64748b') ?>;color:#fff;border-radius:999px;padding:1px 7px;font-size:10px;margin-left:4px;"><?= $cnt ?></span>
          <?php endif; ?>
        </a>
      <?php endforeach; ?>
    </div>

    <?php if (empty($solicitudes)): ?>
      <div style="text-align:center;padding:3rem 1rem;color:#94a3b8;">
        <i class="fa fa-inbox" style="font-size:2.5rem;display:block;margin-bottom:.75rem;"></i>
        <div style="font-weight:600;">No hay comprobantes</div>
      </div>
    <?php else: ?>
      <div style="background:#fff;border:1px solid #e2e8f0;border-radius:14px;overflow:hidden;box-shadow:0 1px 4px rgba(0,0,0,.04);">
        <table class="table table-borderless mb-0" style="color:#0f172a;">
          <thead style="background:#f8fafc;">
            <tr>
              <th class="th-label">Grupo / Proyecto</th>
              <th class="th-label">Organización</th>
              <th class="th-label">Documento</th>
              <th class="th-label">Exonerado</th>
              <th class="th-label">Estado</th>
              <th class="th-label">Acción</th>
            </tr>
          </thead>
          <tbody>
            <?php foreach ($solicitudes as $s):
              $e = $estadoLabel[$s['estado_pago']] ?? $estadoLabel['pendiente'];
            ?>
            <tr style="border-bottom:1px solid #f1f5f9;">
              <td style="padding:12px 16px;">
                <div style="font-weight:600;"><?= htmlspecialchars($s['nombre_proyecto']) ?></div>
                <div style="font-size:11px;color:#64748b;">Líder: <?= htmlspecialchars($s['lider_nombre']) ?></div>
              </td>
              <td style="padding:12px 16px;font-size:12px;"><?= htmlspecialchars($s['organizacion'] ?? '—') ?></td>
              <td style="padding:12px 16px;font-size:12px;">
                <?= !empty($s['comprobante_pago']) ? '<span style="color:#059669;"><i class="fa fa-paperclip me-1"></i>Adjunto</span>' : '<span style="color:#dc2626;"><i class="fa fa-xmark me-1"></i>Sin archivo</span>' ?>
              </td>
              <td style="padding:12px 16px;">
                <?= $s['exonerado'] ? '<span class="exon-badge"><i class="fa fa-star"></i>Sí · $0</span>' : '<span style="font-size:12px;color:#94a3b8;">—</span>' ?>
              </td>
              <td style="padding:12px 16px;">
                <span class="est-badge" style="background:<?= $e['bg'] ?>;color:<?= $e['color'] ?>;border:1px solid <?= $e['border'] ?>;"><?= $e['txt'] ?></span>
              </td>
              <td style="padding:12px 16px;">
                <a href="?id=<?= $s['id_grupo'] ?>" class="btn btn-sm <?= $s['estado_pago']==='enviada'?'btn-primary':'btn-outline-secondary' ?>">
                  <i class="fa fa-<?= $s['estado_pago']==='enviada'?'eye':'magnifying-glass' ?> me-1"></i>
                  <?= $s['estado_pago']==='enviada'?'Revisar':'Ver' ?>
                </a>
              </td>
            </tr>
            <?php endforeach; ?>
          </tbody>
        </table>
      </div>
    <?php endif; ?>
    <?php endif; ?>
  </main>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap/5.3.3/js/bootstrap.bundle.min.js"></script>
<script>var BASE_URL = '<?= BASE_URL ?>';</script>
<script src="<?= BASE_URL ?>/assets/js/sigvp.js"></script>
<script>
// ── Exoneración individual: sincronizar checkboxes → form + total en tiempo real ──
var precioVinc = parseFloat('<?= $precioVinc ?>') || 0;

function actualizarTotal() {
    var checks   = document.querySelectorAll('.chk-exon-ind');
    if (!checks.length) return;

    var total        = 0;
    var exonerados   = 0;
    var container    = document.getElementById('hidden-exon-container');
    if (container) container.innerHTML = '';

    checks.forEach(function(chk) {
        var row      = chk.closest('tr');
        var tdSub    = row ? row.querySelector('.td-subtotal') : null;
        var esExon   = chk.checked;

        if (esExon) {
            exonerados++;
            if (tdSub) tdSub.innerHTML = '<span style="color:#d97706;font-weight:700;">$0.00</span>';
            // Agregar hidden input al form de aprobar
            if (container) {
                var inp = document.createElement('input');
                inp.type  = 'hidden';
                inp.name  = 'exonerado_miembro[]';
                inp.value = chk.dataset.est;
                container.appendChild(inp);
            }
        } else {
            total += precioVinc;
            if (tdSub) tdSub.innerHTML = '<span style="color:#059669;font-weight:700;">$' + precioVinc.toFixed(2) + '</span>';
        }
    });

    // Actualizar total en la tabla
    var tdTotal = document.getElementById('td-total');
    if (tdTotal) tdTotal.textContent = '$' + total.toFixed(2);

    // Resumen texto
    var resumen = document.getElementById('resumen-exon');
    if (resumen && exonerados > 0) {
        resumen.textContent = exonerados + ' exonerado' + (exonerados > 1 ? 's' : '') + ' · ';
    } else if (resumen) {
        resumen.textContent = '';
    }

    // Mensaje en el form de aprobar
    var msgPago = document.getElementById('msg-pago-resumen');
    if (msgPago) {
        if (total === 0) {
            msgPago.innerHTML = 'Todos exonerados de pago <strong>($0.00)</strong>.';
            msgPago.style.color = '#d97706';
        } else {
            msgPago.innerHTML = 'Pago de <strong>$' + total.toFixed(2) + '</strong> recibido correctamente.';
            msgPago.style.color = '#059669';
        }
    }
}

function confirmarAprobacion() {
    var total = 0;
    document.querySelectorAll('.chk-exon-ind:not(:checked)').forEach(function() { total += precioVinc; });
    var msg = total === 0
        ? '¿Confirmas la validación? Todos los integrantes quedan EXONERADOS ($0.00).'
        : '¿Confirmas la validación? Total a pagar: $' + total.toFixed(2);
    return confirm(msg);
}

// Inicializar
document.querySelectorAll('.chk-exon-ind').forEach(function(chk) {
    chk.addEventListener('change', actualizarTotal);
});
actualizarTotal();
</script>
</body>
</html>