<?php
// modules/tutor/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_TUTOR);

$user=currentUser();$db=getDB();$pageTitle='Vinculacion — Tutor';

$stT=$db->prepare("SELECT id_tutor FROM tutores WHERE id_usuario=:u");
$stT->execute([':u'=>$user['id']]);$tutor=$stT->fetch();
$tid=$tutor?$tutor['id_tutor']:0;

// ── Filtros GET ──────────────────────────────────────────────
$filtroPeriodo = trim($_GET['periodo'] ?? '');
$filtroCarrera = trim($_GET['carrera'] ?? '');
$filtroEstado  = trim($_GET['estado']  ?? '');
$_pp           = (int)($_GET['pp'] ?? 10);
$porPagina     = in_array($_pp, [10,25,50,100]) ? $_pp : 10;
$pagina        = max(1, (int)($_GET['pag'] ?? 1));
$totalRegistros = 0;
$totalPaginas   = 1;
$periodos       = [];
$carreras       = [];

// ── POST ─────────────────────────────────────────────────────
if($_SERVER['REQUEST_METHOD']==='POST'&&$tid){
  $accion=$_POST['accion']??'';

  if($accion==='calificar_vinculacion'){
    $idGrupo=(int)($_POST['id_grupo']??0);
    $chkG=$db->prepare("SELECT id_grupo FROM grupos_vinculacion WHERE id_grupo=:g AND id_tutor=:t AND estado='completado'");
    $chkG->execute([':g'=>$idGrupo,':t'=>$tid]);
    if($chkG->fetch()){
      $notas=(array)($_POST['notas']??[]);
      $db->beginTransaction();
      try{
        $sql="INSERT INTO calificaciones_vinculacion (id_grupo,id_estudiante,id_tutor,nota_informe_pdf,nota_trabajo_individual) VALUES(:g,:e,:t,:n1,:n2) ON DUPLICATE KEY UPDATE nota_informe_pdf=VALUES(nota_informe_pdf),nota_trabajo_individual=VALUES(nota_trabajo_individual),id_tutor=VALUES(id_tutor)";
        $stmt=$db->prepare($sql);
        foreach($notas as $idEst=>$vals){
          $idEst=(int)$idEst;
          $n1=isset($vals['n1'])&&$vals['n1']!==''?(float)$vals['n1']:null;
          $n2=isset($vals['n2'])&&$vals['n2']!==''?(float)$vals['n2']:null;
          if($n1!==null){$n1=max(0,min(100,$n1));}
          if($n2!==null){$n2=max(0,min(100,$n2));}
          if($idEst>0) $stmt->execute([':g'=>$idGrupo,':e'=>$idEst,':t'=>$tid,':n1'=>$n1,':n2'=>$n2]);
        }
        $db->commit();
        registrarAudit($user['id'],'calificar_vinculacion','calificaciones_vinculacion',$idGrupo);
        flashSet('ok','Calificaciones guardadas correctamente.');
      }catch(Exception $ex){$db->rollBack();flashSet('err','Error al guardar: '.$ex->getMessage());}
    }else{flashSet('warn','El grupo no esta disponible para calificacion.');}
    header('Location: vinculacion.php?grupo='.$idGrupo);exit;
  }

  $idBit=(int)($_POST['id_bitacora']??0);
  $comentario=trim($_POST['comentario']??'');
  if(in_array($accion,['validada','observada'])&&$idBit){
    $chk=$db->prepare("SELECT b.id_bitacora FROM bitacoras_grupo_vinculacion b JOIN grupos_vinculacion g ON g.id_grupo=b.id_grupo WHERE b.id_bitacora=:bid AND g.id_tutor=:tid AND b.estado='enviada'");
    $chk->execute([':bid'=>$idBit,':tid'=>$tid]);
    if($chk->fetch()){
      $db->prepare("UPDATE bitacoras_grupo_vinculacion SET estado=:e,comentario_tutor=:c,fecha_validacion=NOW() WHERE id_bitacora=:id")
        ->execute([':e'=>$accion,':c'=>$comentario?:null,':id'=>$idBit]);
      $grpQ=$db->prepare("SELECT id_grupo FROM bitacoras_grupo_vinculacion WHERE id_bitacora=:id");
      $grpQ->execute([':id'=>$idBit]);$grp=$grpQ->fetch();
      if($grp){
        $db->prepare("UPDATE grupos_vinculacion SET horas_cumplidas=(SELECT COALESCE(SUM(horas_totales_grupo),0) FROM bitacoras_grupo_vinculacion WHERE id_grupo=:g AND estado IN ('enviada','validada')),estado=CASE WHEN estado='aprobado' THEN 'en_progreso' ELSE estado END WHERE id_grupo=:g2")
          ->execute([':g'=>$grp['id_grupo'],':g2'=>$grp['id_grupo']]);
      }
      registrarAudit($user['id'],$accion.'_bitacora_vinculacion','bitacoras_grupo_vinculacion',$idBit);
      flashSet('ok',$accion==='validada'?'Bitacora validada.':'Observacion enviada.');
    }
    header('Location: vinculacion.php');exit;
  }

  if($accion==='revisar_informe'){
    $idEntrega=(int)($_POST['id_entrega']??0);
    $decision=$_POST['decision']??'';
    $observacion=trim($_POST['observacion_tutor']??'');
    $gRedir=(int)($_POST['id_grupo']??0);
    if($idEntrega&&in_array($decision,['aprobado','observado'])){
      $chkE=$db->prepare("SELECT eiv.id_entrega FROM entregas_informe_vinculacion eiv JOIN grupos_vinculacion g ON g.id_grupo=eiv.id_grupo WHERE eiv.id_entrega=:id AND g.id_tutor=:t AND eiv.estado='pendiente_revision'");
      $chkE->execute([':id'=>$idEntrega,':t'=>$tid]);$rowE=$chkE->fetch();
      if($rowE){
        if($decision==='aprobado'){
          $db->prepare("UPDATE entregas_informe_vinculacion SET estado='aprobado',observacion_tutor=NULL,updated_at=NOW() WHERE id_entrega=:id")->execute([':id'=>$idEntrega]);
          if($gRedir){$db->prepare("UPDATE grupos_vinculacion SET estado='completado',updated_at=NOW() WHERE id_grupo=:g")->execute([':g'=>$gRedir]);}
          registrarAudit($user['id'],'aprobar_informe_vinculacion','entregas_informe_vinculacion',$idEntrega);
          flashSet('ok','Informe APROBADO. Grupo COMPLETADO — ya puedes ingresar calificaciones.');
        }else{
          if(!$observacion){flashSet('warn','Debes escribir la observacion.');header('Location: vinculacion.php?grupo='.$gRedir);exit;}
          $db->prepare("UPDATE entregas_informe_vinculacion SET estado='observado',observacion_tutor=:obs,updated_at=NOW() WHERE id_entrega=:id")->execute([':obs'=>$observacion,':id'=>$idEntrega]);
          registrarAudit($user['id'],'observar_informe_vinculacion','entregas_informe_vinculacion',$idEntrega);
          flashSet('warn','Informe devuelto con observacion.');
        }
      }else{flashSet('warn','Esta entrega no esta disponible.');}
    }
    header('Location: vinculacion.php'.($gRedir?'?grupo='.$gRedir:''));exit;
  }
  header('Location: vinculacion.php');exit;
}

// ── Datos base ────────────────────────────────────────────────
$bitPendientes=[];$totalBitPend=0;$totalBitVal=0;$totalInformesRev=0;
$informesPorGrupo=[];$grupos=[];$totalGrupos=0;

if($tid){
  // Combos desde practicas del tutor (siempre tienen datos)
  $stPer=$db->prepare("
    SELECT DISTINCT pe.id_periodo, pe.nombre
    FROM practicas pr
    JOIN periodos_academicos pe ON pe.id_periodo = pr.id_periodo
    WHERE pr.id_tutor = :tid
    UNION
    SELECT DISTINCT pe.id_periodo, pe.nombre
    FROM grupos_vinculacion g
    JOIN periodos_academicos pe ON pe.id_periodo = g.id_periodo
    WHERE g.id_tutor = :tid2
    ORDER BY nombre DESC
  ");
  $stPer->execute([':tid'=>$tid, ':tid2'=>$tid]);$periodos=$stPer->fetchAll();

  $stCar=$db->prepare("
    SELECT DISTINCT c.id_carrera, c.nombre
    FROM practicas pr
    JOIN estudiantes e ON e.id_estudiante = pr.id_estudiante
    JOIN carreras c    ON c.id_carrera    = e.id_carrera
    WHERE pr.id_tutor = :tid
    UNION
    SELECT DISTINCT c.id_carrera, c.nombre
    FROM grupos_vinculacion g
    JOIN estudiantes el ON el.id_estudiante = g.id_lider
    JOIN carreras c     ON c.id_carrera     = el.id_carrera
    WHERE g.id_tutor = :tid2
    ORDER BY nombre ASC
  ");
  $stCar->execute([':tid'=>$tid, ':tid2'=>$tid]);$carreras=$stCar->fetchAll();

  // Bitácoras pendientes (sin paginar, son alertas)
  $qbp=$db->prepare("SELECT b.*,g.nombre_proyecto,g.id_grupo,COALESCE(ob.nombre,g.org_nueva_nombre) AS organizacion,CONCAT(ul.nombres,' ',ul.apellidos) AS lider_nombre,COUNT(s.id_seccion) AS total_secciones FROM bitacoras_grupo_vinculacion b JOIN grupos_vinculacion g ON g.id_grupo=b.id_grupo JOIN periodos_academicos pe ON pe.id_periodo=g.id_periodo LEFT JOIN organizaciones_beneficiarias ob ON ob.id_organizacion=g.id_organizacion JOIN estudiantes el ON el.id_estudiante=g.id_lider JOIN usuarios ul ON ul.id_usuario=el.id_usuario LEFT JOIN secciones_bitacora_vinculacion s ON s.id_bitacora=b.id_bitacora WHERE g.id_tutor=:t AND b.estado='enviada' AND pe.activo=1 GROUP BY b.id_bitacora ORDER BY b.updated_at ASC");
  $qbp->execute([':t'=>$tid]);$bitPendientes=$qbp->fetchAll();$totalBitPend=count($bitPendientes);

  $qbv=$db->prepare("SELECT COUNT(*) FROM bitacoras_grupo_vinculacion b JOIN grupos_vinculacion g ON g.id_grupo=b.id_grupo WHERE g.id_tutor=:t AND b.estado='validada'");
  $qbv->execute([':t'=>$tid]);$totalBitVal=(int)$qbv->fetchColumn();

  try{
    $qinf=$db->prepare("SELECT eiv.id_grupo,eiv.estado FROM entregas_informe_vinculacion eiv JOIN grupos_vinculacion g ON g.id_grupo=eiv.id_grupo WHERE g.id_tutor=:t ORDER BY eiv.created_at DESC");
    $qinf->execute([':t'=>$tid]);
    foreach($qinf->fetchAll() as $row){if(!isset($informesPorGrupo[$row['id_grupo']]))$informesPorGrupo[$row['id_grupo']]=$row['estado'];}
    $totalInformesRev=count(array_filter($informesPorGrupo,fn($s)=>$s==='pendiente_revision'));
  }catch(Exception $ex){$informesPorGrupo=[];}

  // WHERE dinámico para grupos
  $where  = "WHERE g.id_tutor=:t";
  $params = [':t'=>$tid];
  if($filtroPeriodo!==''){$where.=" AND pe.id_periodo=:pid";$params[':pid']=$filtroPeriodo;}
  else{$where.=" AND pe.activo=1";}
  if($filtroCarrera!==''){$where.=" AND el.id_carrera=:cid";$params[':cid']=$filtroCarrera;}
  if($filtroEstado!==''){$where.=" AND g.estado=:est";$params[':est']=$filtroEstado;}

  $sqlBase="FROM grupos_vinculacion g JOIN periodos_academicos pe ON pe.id_periodo=g.id_periodo LEFT JOIN organizaciones_beneficiarias ob ON ob.id_organizacion=g.id_organizacion JOIN estudiantes el ON el.id_estudiante=g.id_lider JOIN usuarios ul ON ul.id_usuario=el.id_usuario LEFT JOIN miembros_grupo_vinculacion m ON m.id_grupo=g.id_grupo AND m.estado='activo' LEFT JOIN carreras car ON car.id_carrera=el.id_carrera $where";

  $stCount=$db->prepare("SELECT COUNT(DISTINCT g.id_grupo) $sqlBase");
  $stCount->execute($params);$totalRegistros=(int)$stCount->fetchColumn();
  $totalPaginas=$totalRegistros>0?max(1,(int)ceil($totalRegistros/$porPagina)):1;
  $pagina=min($pagina,$totalPaginas);$offset=($pagina-1)*$porPagina;
  $totalGrupos=$totalRegistros;

  $paramsPag=$params;$paramsPag[':lim']=$porPagina;$paramsPag[':off']=$offset;
  $qg=$db->prepare("SELECT g.*,COALESCE(ob.nombre,g.org_nueva_nombre) AS organizacion,COALESCE(ob.canton,g.org_nueva_canton) AS org_canton,pe.nombre AS periodo_nombre,CONCAT(ul.nombres,' ',ul.apellidos) AS lider_nombre,COUNT(m.id_miembro) AS total_miembros,COALESCE(car.horas_minimas_vinculacion,g.horas_requeridas) AS horas_requeridas_carrera $sqlBase GROUP BY g.id_grupo ORDER BY FIELD(g.estado,'aprobado','en_progreso','completado'),g.created_at DESC LIMIT :lim OFFSET :off");
  $qg->execute($paramsPag);$grupos=$qg->fetchAll();
}

function urlVinc(array $extra=[]): string{
  global $filtroPeriodo,$filtroCarrera,$filtroEstado,$porPagina,$pagina;
  $base=['periodo'=>$filtroPeriodo,'carrera'=>$filtroCarrera,'estado'=>$filtroEstado,'pp'=>$porPagina,'pag'=>$pagina];
  return 'vinculacion.php?'.http_build_query(array_merge($base,$extra));
}

// Vista detalle bitácora
$verBit=null;$secciones=[];$miembrosGrupo=[];
$idVer=(int)($_GET['bit']??0);
if($idVer&&$tid){
  $qvb=$db->prepare("SELECT b.*,g.nombre_proyecto,g.id_grupo,g.horas_requeridas AS grupo_horas_req,COALESCE(ob.nombre,g.org_nueva_nombre) AS organizacion FROM bitacoras_grupo_vinculacion b JOIN grupos_vinculacion g ON g.id_grupo=b.id_grupo LEFT JOIN organizaciones_beneficiarias ob ON ob.id_organizacion=g.id_organizacion WHERE b.id_bitacora=:bid AND g.id_tutor=:tid");
  $qvb->execute([':bid'=>$idVer,':tid'=>$tid]);$verBit=$qvb->fetch();
  if($verBit){
    $qs=$db->prepare("SELECT s.*,CONCAT(u.apellidos,' ',u.nombres) AS nombre_est,e.codigo_estudiante,m.rol FROM secciones_bitacora_vinculacion s JOIN estudiantes e ON e.id_estudiante=s.id_estudiante JOIN usuarios u ON u.id_usuario=e.id_usuario JOIN miembros_grupo_vinculacion m ON m.id_estudiante=s.id_estudiante AND m.id_grupo=:g WHERE s.id_bitacora=:bid ORDER BY m.rol DESC,u.apellidos");
    $qs->execute([':g'=>$verBit['id_grupo'],':bid'=>$idVer]);$secciones=$qs->fetchAll();
    $qmg=$db->prepare("SELECT COUNT(*) FROM miembros_grupo_vinculacion WHERE id_grupo=:g AND estado='activo'");
    $qmg->execute([':g'=>$verBit['id_grupo']]);$miembrosGrupo=(int)$qmg->fetchColumn();
  }
}

// Vista detalle grupo
$verGrupo=null;$miembrosDetalle=[];$bitacorasGrupo=[];$entregaInf=null;
$calificacionesMapa=[];$totalCalificados=0;
$idGrupoVer=(int)($_GET['grupo']??0);
if($idGrupoVer&&$tid){
  $qvg=$db->prepare("SELECT g.*,COALESCE(ob.nombre,g.org_nueva_nombre) AS organizacion,COALESCE(ob.canton,g.org_nueva_canton) AS org_canton,COALESCE(ob.tipo,g.org_nueva_tipo) AS org_tipo,pe.nombre AS periodo_nombre,CONCAT(ul.nombres,' ',ul.apellidos) AS lider_nombre,COALESCE(car.horas_minimas_vinculacion,g.horas_requeridas) AS horas_requeridas_carrera FROM grupos_vinculacion g JOIN periodos_academicos pe ON pe.id_periodo=g.id_periodo LEFT JOIN organizaciones_beneficiarias ob ON ob.id_organizacion=g.id_organizacion JOIN estudiantes el ON el.id_estudiante=g.id_lider JOIN usuarios ul ON ul.id_usuario=el.id_usuario LEFT JOIN carreras car ON car.id_carrera=el.id_carrera WHERE g.id_grupo=:id AND g.id_tutor=:tid");
  $qvg->execute([':id'=>$idGrupoVer,':tid'=>$tid]);$verGrupo=$qvg->fetch();
  if($verGrupo){
    $qmd=$db->prepare("SELECT m.*,CONCAT(u.apellidos,' ',u.nombres) AS nombre_completo,c.nombre AS carrera,e.codigo_estudiante 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 c ON c.id_carrera=e.id_carrera WHERE m.id_grupo=:g AND m.estado='activo' ORDER BY m.rol DESC,u.apellidos");
    $qmd->execute([':g'=>$idGrupoVer]);$miembrosDetalle=$qmd->fetchAll();
    $qbg=$db->prepare("SELECT b.*,COUNT(s.id_seccion) AS total_sec FROM bitacoras_grupo_vinculacion b LEFT JOIN secciones_bitacora_vinculacion s ON s.id_bitacora=b.id_bitacora WHERE b.id_grupo=:g GROUP BY b.id_bitacora ORDER BY b.semana_numero DESC");
    $qbg->execute([':g'=>$idGrupoVer]);$bitacorasGrupo=$qbg->fetchAll();
    try{
      $qei=$db->prepare("SELECT eiv.*,CONCAT(u.nombres,' ',u.apellidos) AS nombre_lider FROM entregas_informe_vinculacion eiv JOIN estudiantes est ON est.id_estudiante=eiv.id_estudiante_lider JOIN usuarios u ON u.id_usuario=est.id_usuario WHERE eiv.id_grupo=:g ORDER BY eiv.created_at DESC LIMIT 1");
      $qei->execute([':g'=>$idGrupoVer]);$entregaInf=$qei->fetch();
    }catch(Exception $ex){$entregaInf=null;}
    if($verGrupo['estado']==='completado'){
      try{
        $qcal=$db->prepare("SELECT cv.id_estudiante,cv.nota_informe_pdf,cv.nota_trabajo_individual,cv.nota_promedio,cv.estado,cv.observaciones,cv.fecha_calificacion FROM calificaciones_vinculacion cv WHERE cv.id_grupo=:g");
        $qcal->execute([':g'=>$idGrupoVer]);
        foreach($qcal->fetchAll() as $c){$calificacionesMapa[$c['id_estudiante']]=$c;}
        $totalCalificados=count(array_filter($calificacionesMapa,fn($c)=>$c['estado']==='calificado'));

        // ── Ventana de edición: 48h desde la primera calificación guardada ──
        $fechasCalif = array_filter(array_column($calificacionesMapa,'fecha_calificacion'));
        $primeraCalif = $fechasCalif ? min($fechasCalif) : null;
        $segundosRestantes = null;
        $bloqueadoPor48h   = false;
        if ($primeraCalif) {
            $limite = strtotime($primeraCalif) + (48 * 3600);
            $segundosRestantes = $limite - time();
            $bloqueadoPor48h   = $segundosRestantes <= 0;
        }
      }catch(Exception $ex){$calificacionesMapa=[];}
    }
  }
}
$eColor=['pendiente'=>'#f59e0b','aprobado'=>'#16a34a','en_progreso'=>'#3b82f6','completado'=>'#8b5cf6'];
?>
<?php $paginaActual='vinculacion';?>
<!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-tutor.css">
<style>
.sec-card{border:1px solid #e2e8f0;border-radius:10px;padding:16px;margin-bottom:10px}
.sec-card.lider-card{border-color:#fde68a;background:#fffbeb}
.sec-autor{font-size:11px;color:#64748b;font-weight:700;text-transform:uppercase;letter-spacing:.5px;margin-bottom:6px}
.grupo-card{background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:18px;margin-bottom:12px;box-shadow:0 1px 4px rgba(0,0,0,.05);transition:box-shadow .2s}
.grupo-card:hover{box-shadow:0 4px 12px rgba(0,0,0,.08)}
.pend-badge{background:#fef3c7;color:#d97706;border:1px solid #fde68a;font-size:10px;padding:2px 8px;border-radius:20px;font-weight:700}
.calif-panel{background:#fff;border:2px solid #8b5cf6;border-radius:14px;overflow:hidden;margin-bottom:20px}
.calif-header{background:linear-gradient(135deg,#8b5cf6 0%,#7c3aed 100%);padding:16px 20px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px}
.calif-header h6{color:#fff;font-size:14px;font-weight:700;margin:0}
.calif-locked{background:#f8fafc;border:2px dashed #e2e8f0;border-radius:14px;padding:32px;text-align:center;margin-bottom:20px}
.nota-input{width:70px;padding:5px 6px;border:1.5px solid #e2e8f0;border-radius:8px;font-size:13px;text-align:center;font-weight:600;transition:border-color .2s}
.nota-input:focus{outline:none;border-color:#8b5cf6;box-shadow:0 0 0 3px #8b5cf620}
.promedio-badge{font-size:13px;font-weight:700;padding:4px 12px;border-radius:20px;display:inline-block;min-width:60px;text-align:center}
.aprobado-bg{background:#f0fdf4;color:#16a34a;border:1px solid #bbf7d0}
.reprobado-bg{background:#fff1f0;color:#ef4444;border:1px solid #fecaca}
.pendiente-bg{background:#f8fafc;color:#94a3b8;border:1px solid #e2e8f0}
.obs-input{width:100%;font-size:12px;padding:4px 8px;border:1px solid #e2e8f0;border-radius:6px;resize:none}
.obs-input:focus{outline:none;border-color:#8b5cf6}
.save-btn-main{background:#8b5cf6;color:#fff;border:none;padding:10px 28px;border-radius:10px;font-size:13px;font-weight:700;cursor:pointer;transition:background .2s}
.save-btn-main:hover{background:#7c3aed}
/* Filtros y paginación */
.filtros-bar{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end;background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:14px 16px;margin-bottom:20px}
.filtros-bar label{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.5px;color:#64748b;margin-bottom:3px;display:block}
.filtros-bar select{border:1.5px solid #e2e8f0;border-radius:8px;padding:6px 10px;font-size:13px;background:#f8fafc;color:#1e293b;min-width:150px;cursor:pointer}
.filtros-bar select:focus{outline:none;border-color:#10b981;box-shadow:0 0 0 3px rgba(16,185,129,.12)}
.btn-filtrar{background:linear-gradient(135deg,#0f1f3d,#10b981);border:none;border-radius:8px;color:#fff;font-size:13px;font-weight:600;padding:7px 18px;cursor:pointer;transition:opacity .2s}
.btn-filtrar:hover{opacity:.88}
.btn-limpiar{background:none;border:1.5px solid #e2e8f0;border-radius:8px;color:#64748b;font-size:13px;padding:6px 14px;cursor:pointer;text-decoration:none;display:inline-flex;align-items:center;transition:all .2s}
.btn-limpiar:hover{border-color:#94a3b8;color:#334155}
.paginacion{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;margin-top:12px;padding:8px 4px}
.pag-info{font-size:12px;color:#64748b}
.pag-btns{display:flex;gap:4px;flex-wrap:wrap}
.pag-btn{min-width:34px;height:34px;border-radius:7px;border:1.5px solid #e2e8f0;background:#fff;color:#374151;font-size:13px;font-weight:500;display:flex;align-items:center;justify-content:center;cursor:pointer;text-decoration:none;transition:all .15s}
.pag-btn:hover{border-color:#10b981;color:#10b981}
.pag-btn.active{background:#10b981;border-color:#10b981;color:#fff;font-weight:700}
.pag-btn.disabled{opacity:.4;pointer-events:none}
.pp-sel{border:1.5px solid #e2e8f0;border-radius:7px;padding:5px 8px;font-size:12px;background:#f8fafc;color:#374151;cursor:pointer}
</style>
</head><body>
<?php include __DIR__.'/../../includes/navbar.php';?>
<div class="app-shell">
<?php include __DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'includes'.DIRECTORY_SEPARATOR.'sidebar-tutor.php';?>
<main class="main-area">

<?php if($verBit):
  $totalHoras=array_sum(array_column($secciones,'horas'));
?>
  <div class="page-header d-flex justify-content-between align-items-start flex-wrap gap-2">
    <div>
      <a href="vinculacion.php" style="font-size:12px;color:#64748b;text-decoration:none"><i class="fa fa-arrow-left me-1"></i>Volver</a>
      <h4 class="mt-1">Semana <?=$verBit['semana_numero']?> — <?=htmlspecialchars($verBit['nombre_proyecto'])?></h4>
      <p style="color:#64748b;font-size:13px;"><i class="fa fa-building me-1"></i><?=htmlspecialchars($verBit['organizacion'])?> &nbsp;·&nbsp; <?=formatFecha($verBit['fecha_inicio_semana'])?> – <?=formatFecha($verBit['fecha_fin_semana'])?></p>
    </div>
    <div class="text-end"><?=badgeEstado($verBit['estado'])?><div style="font-size:12px;color:#64748b;margin-top:4px;"><?=count($secciones)?>/<strong><?=$miembrosGrupo?></strong> integrantes aportaron</div></div>
  </div>
  <?=flashHtml()?>
  <?php if($verBit['comentario_tutor']):?>
  <div class="alert alert-warning mb-3" style="font-size:13px;"><i class="fa fa-comment me-1"></i><strong>Tu observacion previa:</strong> <?=htmlspecialchars($verBit['comentario_tutor'])?></div>
  <?php endif;?>
  <?php if(empty($secciones)):?>
  <div class="alert alert-info" style="font-size:13px;"><i class="fa fa-info-circle me-1"></i>Esta bitacora no tiene secciones registradas aun.</div>
  <?php else:foreach($secciones as $s):$esLider=$s['rol']==='lider';?>
  <div class="sec-card <?=$esLider?'lider-card':''?>">
    <div class="sec-autor">
      <?php if($esLider):?><i class="fa fa-crown me-1" style="color:#d97706"></i><?php endif;?>
      <?=htmlspecialchars($s['nombre_est'])?> <span style="opacity:.6">(<?=htmlspecialchars($s['codigo_estudiante'])?>)</span>
      <?php if($esLider):?><span style="color:#d97706;font-size:10px;font-weight:700"> — LIDER</span><?php endif;?>
    </div>
    <div class="d-flex justify-content-between align-items-start gap-3">
      <div style="flex:1">
        <div style="font-size:11px;color:#94a3b8;margin-bottom:3px"><?=date('d/m/Y',strtotime($s['fecha']))?></div>
        <div style="font-size:14px;color:#1e293b;margin-bottom:8px"><?=nl2br(htmlspecialchars($s['descripcion']))?></div>
        <?php if($s['logros']):?><div style="font-size:12px;color:#16a34a;margin-bottom:4px"><strong>Logros:</strong> <?=htmlspecialchars($s['logros'])?></div><?php endif;?>
        <?php if($s['dificultades']):?><div style="font-size:12px;color:#d97706"><strong>Dificultades:</strong> <?=htmlspecialchars($s['dificultades'])?></div><?php endif;?>
      </div>
      <div style="text-align:right;flex-shrink:0"><div style="font-size:28px;font-weight:800;color:#3b82f6"><?=$s['horas']?><span style="font-size:13px;color:#94a3b8;font-weight:400">h</span></div></div>
    </div>
  </div>
  <?php endforeach;endif;?>
  <div style="background:#eff6ff;border:1px solid #bfdbfe;border-radius:10px;padding:14px 20px;display:flex;justify-content:space-between;align-items:center;margin-bottom:20px">
    <div style="font-weight:700;color:#1e40af">TOTAL GRUPO — Semana <?=$verBit['semana_numero']?></div>
    <div style="font-size:28px;font-weight:800;color:#1d4ed8"><?=$verBit['horas_totales_grupo']?><span style="font-size:14px;color:#3b82f6;font-weight:400">h</span></div>
  </div>
  <?php if($verBit['estado']==='enviada'):?>
  <div style="background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:20px">
    <div style="font-size:13px;font-weight:700;color:#0f172a;margin-bottom:14px"><i class="fa fa-gavel me-2" style="color:#3b82f6"></i>Validar esta bitacora grupal</div>
    <form method="POST">
      <input type="hidden" name="id_bitacora" value="<?=$verBit['id_bitacora']?>">
      <div class="mb-3"><label class="form-label">Comentario para el grupo <small style="color:#94a3b8">(opcional)</small></label><textarea name="comentario" class="form-control" rows="3" placeholder="Retroalimentacion, sugerencias..."></textarea></div>
      <div class="d-flex gap-2">
        <button type="submit" name="accion" value="validada" class="btn btn-success flex-fill"><i class="fa fa-circle-check me-2"></i>Validar bitacora</button>
        <button type="submit" name="accion" value="observada" class="btn btn-outline-warning flex-fill"><i class="fa fa-message me-2"></i>Enviar observacion</button>
      </div>
    </form>
  </div>
  <?php elseif($verBit['estado']==='validada'):?>
  <div style="background:#f0fdf4;border:1px solid #bbf7d0;border-radius:10px;padding:14px;text-align:center;color:#16a34a;font-weight:600"><i class="fa fa-circle-check me-2"></i>Bitacora ya validada el <?=formatFecha($verBit['fecha_validacion'])?></div>
  <?php elseif($verBit['estado']==='observada'):?>
  <div style="background:#fffbeb;border:1px solid #fde68a;border-radius:10px;padding:14px;color:#92400e;font-weight:600"><i class="fa fa-comment me-2"></i>Bitacora observada — el grupo puede editarla y reenviarla</div>
  <?php endif;?>

<?php elseif($verGrupo):
  $horasReqGrupo=(int)($verGrupo['horas_requeridas_carrera']??$verGrupo['horas_requeridas']);
  $pct=$horasReqGrupo>0?min(100,round($verGrupo['horas_cumplidas']/$horasReqGrupo*100)):0;
  $pcColor=$pct>=80?'#16a34a':($pct>=40?'#d97706':'#3b82f6');
  $ec=$eColor[$verGrupo['estado']]??'#64748b';
  $esCompletado=$verGrupo['estado']==='completado';
  $totalMiembros=count($miembrosDetalle);
?>
  <div class="page-header d-flex justify-content-between align-items-start flex-wrap gap-2 mb-4">
    <div>
      <a href="vinculacion.php" style="font-size:12px;color:#64748b;text-decoration:none"><i class="fa fa-arrow-left me-1"></i>Volver a mis grupos</a>
      <h4 class="mt-1 mb-1"><?=htmlspecialchars($verGrupo['nombre_proyecto'])?></h4>
      <p style="font-size:13px;color:#64748b"><i class="fa fa-building me-1"></i><?=htmlspecialchars($verGrupo['organizacion'])?> &nbsp;·&nbsp; <?=htmlspecialchars($verGrupo['periodo_nombre'])?></p>
    </div>
    <span style="font-size:11px;padding:4px 14px;border-radius:20px;font-weight:700;background:<?=$ec?>18;color:<?=$ec?>;border:1px solid <?=$ec?>44">&#9679; <?=ucfirst($verGrupo['estado'])?></span>
  </div>
  <?=flashHtml()?>
  <div class="row g-3 mb-4">
    <div class="col-sm-3"><div class="stat-card"><div><div class="stat-num" style="color:#3b82f6"><?=$totalMiembros?></div><div class="stat-label">Integrantes</div></div><div class="stat-icon">👥</div></div></div>
    <div class="col-sm-3"><div class="stat-card"><div><div class="stat-num" style="color:#d97706"><?=$verGrupo['horas_cumplidas']?></div><div class="stat-label">Horas cumplidas</div></div><div class="stat-icon">⏱️</div></div></div>
    <div class="col-sm-3"><div class="stat-card"><div><div class="stat-num" style="color:#16a34a"><?=$horasReqGrupo?></div><div class="stat-label">Horas requeridas</div></div><div class="stat-icon">🎯</div></div></div>
    <div class="col-sm-3"><div class="stat-card"><div><div class="stat-num" style="color:#8b5cf6"><?=$esCompletado?$totalCalificados.'/'.$totalMiembros:$pct.'%'?></div><div class="stat-label"><?=$esCompletado?'Calificados':'Progreso'?></div></div><div class="stat-icon"><?=$esCompletado?'🎓':'📊'?></div></div></div>
  </div>
  <div style="background:#fff;border:1px solid #e2e8f0;border-radius:12px;padding:16px 20px;margin-bottom:20px">
    <div style="display:flex;justify-content:space-between;font-size:12px;color:#64748b;margin-bottom:6px"><span>Progreso de horas</span><span style="font-weight:700;color:<?=$pcColor?>"><?=$pct?>%</span></div>
    <div style="background:#e2e8f0;border-radius:6px;height:10px"><div style="width:<?=$pct?>%;height:10px;border-radius:6px;background:<?=$pcColor?>;transition:width .4s"></div></div>
    <div style="font-size:11px;color:#94a3b8;margin-top:4px"><?=$verGrupo['horas_cumplidas']?> / <?=$horasReqGrupo?> horas</div>
  </div>
  <div style="background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;margin-bottom:20px">
    <div style="padding:14px 18px;border-bottom:1px solid #f1f5f9;font-size:13px;font-weight:700;color:#0f172a"><i class="fa fa-users me-2" style="color:#3b82f6"></i>Integrantes del grupo</div>
    <table class="table table-borderless mb-0" style="font-size:13px">
      <thead style="background:#f8fafc"><tr style="font-size:11px;text-transform:uppercase;color:#64748b"><th class="px-4 py-2">Nombre</th><th>Carrera</th><th>Codigo</th><th>Rol</th></tr></thead>
      <tbody>
        <?php foreach($miembrosDetalle as $m):?>
        <tr>
          <td class="px-4 py-2"><strong><?=htmlspecialchars($m['nombre_completo'])?></strong></td>
          <td style="font-size:12px;color:#64748b"><?=htmlspecialchars($m['carrera'])?></td>
          <td style="font-family:monospace;font-size:12px"><?=htmlspecialchars($m['codigo_estudiante'])?></td>
          <td><?=$m['rol']==='lider'?'<span style="font-size:10px;padding:2px 8px;border-radius:20px;background:#fffbeb;color:#92400e;border:1px solid #fde68a;font-weight:700"><i class="fa fa-crown me-1" style="font-size:9px"></i>Lider</span>':'<span style="font-size:11px;color:#64748b">Miembro</span>'?></td>
        </tr>
        <?php endforeach;?>
      </tbody>
    </table>
  </div>
  <div style="background:#fff;border:1px solid #e2e8f0;border-radius:12px;overflow:hidden;margin-bottom:20px">
    <div style="padding:14px 18px;border-bottom:1px solid #f1f5f9;font-size:13px;font-weight:700;color:#0f172a"><i class="fa fa-book-open me-2" style="color:#3b82f6"></i>Bitacoras del grupo</div>
    <table class="table table-hover mb-0" style="font-size:13px">
      <thead style="background:#f8fafc"><tr style="font-size:11px;text-transform:uppercase;color:#64748b"><th class="px-4 py-2">Semana</th><th>Periodo</th><th class="text-center">Secciones</th><th class="text-center">Horas</th><th>Estado</th><th class="text-center">Accion</th></tr></thead>
      <tbody>
        <?php if(empty($bitacorasGrupo)):?><tr><td colspan="6" class="text-center text-muted py-4">Sin bitacoras aun.</td></tr>
        <?php else:foreach($bitacorasGrupo as $b):$nMiembros=count($miembrosDetalle);?>
        <tr>
          <td class="px-4 py-2"><strong>Semana <?=$b['semana_numero']?></strong></td>
          <td style="font-size:12px;color:#64748b"><?=formatFecha($b['fecha_inicio_semana'])?> – <?=formatFecha($b['fecha_fin_semana'])?></td>
          <td class="text-center" style="font-weight:600;color:#3b82f6"><?=$b['total_sec']?>/<?=$nMiembros?></td>
          <td class="text-center" style="font-weight:700"><?=$b['horas_totales_grupo']?>h</td>
          <td><?=badgeEstado($b['estado'])?></td>
          <td class="text-center"><a href="vinculacion.php?bit=<?=$b['id_bitacora']?>" class="btn btn-sm btn-outline-secondary"><i class="fa fa-<?=$b['estado']==='enviada'?'gavel':'eye'?> me-1"></i><?=$b['estado']==='enviada'?'Validar':'Ver'?></a></td>
        </tr>
        <?php endforeach;endif;?>
      </tbody>
    </table>
  </div>
  <?php
    $estInf=$entregaInf?$entregaInf['estado']:'sin';
    $colorInf=match($estInf){'pendiente_revision'=>'#f59e0b','observado'=>'#d97706','aprobado'=>'#16a34a',default=>'#94a3b8'};
    $labelInf=match($estInf){'pendiente_revision'=>'En revision — pendiente tu decision','observado'=>'Observado — esperando correccion','aprobado'=>'Aprobado ✓','sin'=>'Sin entregar aun'};
  ?>
  <div style="background:#fff;border:2px solid <?=$colorInf?>44;border-radius:12px;overflow:hidden;margin-bottom:20px">
    <div style="padding:14px 20px;border-bottom:1px solid #f1f5f9;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:8px">
      <div style="font-size:13px;font-weight:700;color:#0f172a"><i class="fa fa-file-lines me-2" style="color:<?=$colorInf?>"></i>Informe Final de Vinculacion</div>
      <span style="font-size:11px;padding:3px 12px;border-radius:20px;font-weight:700;background:<?=$colorInf?>18;color:<?=$colorInf?>;border:1px solid <?=$colorInf?>55"><?=$labelInf?></span>
    </div>
    <div style="padding:18px 20px">
      <?php if(!$entregaInf||$estInf==='sin'):?>
      <div style="text-align:center;padding:24px;color:#94a3b8"><i class="fa fa-file-circle-xmark fa-2x mb-2 d-block"></i>El grupo aun no ha entregado el informe.</div>
      <?php elseif($estInf==='aprobado'):?>
      <div style="display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:12px">
        <div><div style="font-size:13px;color:#16a34a;font-weight:700"><i class="fa fa-circle-check me-1"></i>Informe aprobado por ti</div><div style="font-size:12px;color:#64748b;margin-top:4px">Entregado por: <?=htmlspecialchars($entregaInf['nombre_lider'])?></div></div>
        <a href="<?=BASE_URL?>/uploads/informes_vinculacion/<?=urlencode($entregaInf['archivo'])?>" target="_blank" class="btn btn-sm btn-outline-success"><i class="fa fa-file-circle-check me-1"></i>Ver informe aprobado</a>
      </div>
      <?php else:?>
      <div style="display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:12px;margin-bottom:16px">
        <div>
          <div style="font-size:13px;font-weight:600;color:#0f172a">Entregado por: <?=htmlspecialchars($entregaInf['nombre_lider'])?></div>
          <div style="font-size:12px;color:#64748b;margin-top:2px">Fecha: <?=date('d/m/Y H:i',strtotime($entregaInf['created_at']))?></div>
          <?php if($estInf==='observado'&&$entregaInf['observacion_tutor']):?>
          <div style="margin-top:8px;background:#fffbeb;border:1px solid #fde68a;border-radius:6px;padding:8px 12px;font-size:12px;color:#92400e"><strong>Tu observacion anterior:</strong> <?=nl2br(htmlspecialchars($entregaInf['observacion_tutor']))?></div>
          <?php endif;?>
        </div>
        <a href="<?=BASE_URL?>/uploads/informes_vinculacion/<?=urlencode($entregaInf['archivo'])?>" target="_blank" class="btn btn-sm btn-primary"><i class="fa fa-eye me-1"></i>Ver / Descargar informe</a>
      </div>
      <?php if($estInf==='pendiente_revision'):?>
      <form method="POST">
        <input type="hidden" name="accion" value="revisar_informe">
        <input type="hidden" name="id_entrega" value="<?=$entregaInf['id_entrega']?>">
        <input type="hidden" name="id_grupo" value="<?=$idGrupoVer?>">
        <div class="mb-3"><label class="form-label" style="font-size:13px;font-weight:600">Observacion <small style="color:#94a3b8;font-weight:400">(requerida si devuelves)</small></label><textarea name="observacion_tutor" class="form-control" rows="3" placeholder="Indica que debe corregir..."></textarea></div>
        <div class="d-flex gap-2 flex-wrap">
          <button type="submit" name="decision" value="aprobado" class="btn btn-success" onclick="return confirm('Aprobar el informe? El grupo quedara COMPLETADO.')"><i class="fa fa-circle-check me-2"></i>Aprobar informe</button>
          <button type="submit" name="decision" value="observado" class="btn btn-warning" onclick="return confirm('Devolver para correccion?')"><i class="fa fa-rotate-left me-2"></i>Devolver para correccion</button>
        </div>
      </form>
      <?php else:?>
      <div style="background:#fffbeb;border:1px solid #fde68a;border-radius:8px;padding:12px 16px;font-size:13px;color:#92400e"><i class="fa fa-clock me-1"></i>Esperando que el grupo corrija y reenvie.</div>
      <?php endif;endif;?>
    </div>
  </div>

  <?php if(!$esCompletado):?>
  <div class="calif-locked">
    <i class="fa fa-lock fa-2x mb-3" style="color:#cbd5e1"></i>
    <div style="font-size:14px;font-weight:700;color:#475569;margin-bottom:6px">Calificaciones bloqueadas</div>
    <div style="font-size:13px;color:#94a3b8">Se habilitan cuando el informe sea aprobado y el grupo quede completado.</div>
    <div style="margin-top:12px"><span style="font-size:11px;padding:3px 12px;border-radius:20px;background:#f1f5f9;color:#64748b;border:1px solid #e2e8f0;font-weight:600">Estado actual: <?=ucfirst($verGrupo['estado'])?></span></div>
  </div>
  <?php else:?>
  <div class="calif-panel">
    <div class="calif-header">
      <div><h6><i class="fa fa-graduation-cap me-2"></i>Calificaciones de Vinculacion — <?=htmlspecialchars($verGrupo['nombre_proyecto'])?></h6><div style="font-size:11px;color:rgba(255,255,255,.75);margin-top:3px"><?=$totalCalificados?>/<?=$totalMiembros?> estudiantes calificados &nbsp;·&nbsp; Escala 0–100 &nbsp;·&nbsp; Aprobatorio ≥ 70</div></div>
      <div style="display:flex;gap:6px;flex-wrap:wrap;align-items:center"><span style="background:rgba(255,255,255,.2);color:#fff;font-size:10px;padding:3px 10px;border-radius:20px;font-weight:600;border:1px solid rgba(255,255,255,.3)">CES 2022</span><span style="background:rgba(255,255,255,.2);color:#fff;font-size:10px;padding:3px 10px;border-radius:20px;font-weight:600;border:1px solid rgba(255,255,255,.3)">CACES</span></div>
    </div>
    <div style="padding:18px 20px">
      <div style="display:flex;gap:6px;flex-wrap:wrap;font-size:10px;margin-bottom:16px">
        <span style="background:#f0fdf4;color:#16a34a;padding:2px 8px;border-radius:20px;font-weight:600">90–100 Excelente</span>
        <span style="background:#f0fdf4;color:#16a34a;padding:2px 8px;border-radius:20px;font-weight:600">80–89 Muy Bueno</span>
        <span style="background:#e0f2fe;color:#0369a1;padding:2px 8px;border-radius:20px;font-weight:600">70–79 Bueno</span>
        <span style="background:#fff1f0;color:#ef4444;padding:2px 8px;border-radius:20px;font-weight:600">0–69 Reprobado</span>
      </div>
      <form method="POST" id="formCalif">
        <input type="hidden" name="accion" value="calificar_vinculacion">
        <input type="hidden" name="id_grupo" value="<?=$idGrupoVer?>">
        <div style="overflow-x:auto">
        <table class="table mb-0" style="font-size:13px;min-width:700px">
          <thead><tr style="background:#faf5ff;font-size:11px;text-transform:uppercase;color:#7c3aed;font-weight:700">
            <th class="px-3 py-2" style="width:30px">#</th><th>Estudiante</th><th>Rol</th>
            <th class="text-center" style="width:120px">N1 — Informe PDF<div style="font-size:9px;font-weight:400;color:#a78bfa">(0–100)</div></th>
            <th class="text-center" style="width:120px">N2 — Trabajo Individual<div style="font-size:9px;font-weight:400;color:#a78bfa">(0–100)</div></th>
            <th class="text-center" style="width:110px">Promedio</th>
            <th class="text-center" style="width:100px">Estado</th>
            <th style="width:180px">Observacion</th>
          </tr></thead>
          <tbody>
            <?php foreach($miembrosDetalle as $idx=>$m):
              $idE=$m['id_estudiante'];$cal=$calificacionesMapa[$idE]??null;
              $n1Val=$cal?$cal['nota_informe_pdf']:'';$n2Val=$cal?$cal['nota_trabajo_individual']:'';
              $promVal=$cal?$cal['nota_promedio']:null;$obsVal=$cal?$cal['observaciones']:'';
              $esLider=$m['rol']==='lider';
            ?>
            <tr id="fila_<?=$idE?>">
              <td class="px-3 py-2" style="color:#94a3b8"><?=$idx+1?></td>
              <td><div style="font-weight:600;font-size:12px"><?=htmlspecialchars($m['nombre_completo'])?></div><div style="font-size:10px;color:#94a3b8;font-family:monospace"><?=htmlspecialchars($m['codigo_estudiante'])?></div></td>
              <td><?=$esLider?'<span style="font-size:10px;padding:2px 8px;border-radius:20px;background:#fffbeb;color:#92400e;border:1px solid #fde68a;font-weight:700"><i class="fa fa-crown me-1" style="font-size:9px"></i>Lider</span>':'<span style="font-size:11px;color:#64748b">Miembro</span>'?></td>
              <td class="text-center"><input type="number" class="nota-input" name="notas[<?=$idE?>][n1]" id="n1_<?=$idE?>" min="0" max="100" step="0.01" placeholder="—" value="<?=htmlspecialchars($n1Val??'')?>" oninput="calcProm(<?=$idE?>)" <?=!empty($bloqueadoPor48h)?'disabled':''?>></td>
              <td class="text-center"><input type="number" class="nota-input" name="notas[<?=$idE?>][n2]" id="n2_<?=$idE?>" min="0" max="100" step="0.01" placeholder="—" value="<?=htmlspecialchars($n2Val??'')?>" oninput="calcProm(<?=$idE?>)" <?=!empty($bloqueadoPor48h)?'disabled':''?>></td>
              <td class="text-center">
                <span class="promedio-badge <?php if($promVal===null)echo'pendiente-bg';elseif($promVal>=70)echo'aprobado-bg';else echo'reprobado-bg';?>" id="prom_<?=$idE?>"><?=$promVal!==null?number_format((float)$promVal,1):'—'?></span>
              </td>
              <td class="text-center">
                <span id="est_<?=$idE?>" style="font-size:10px;padding:2px 8px;border-radius:20px;font-weight:700;<?php if($cal&&$cal['estado']==='calificado'){echo $promVal>=70?'background:#f0fdf4;color:#16a34a;border:1px solid #bbf7d0':'background:#fff1f0;color:#ef4444;border:1px solid #fecaca';}else{echo'background:#f8fafc;color:#94a3b8;border:1px solid #e2e8f0';}?>">
                  <?php if($cal&&$cal['estado']==='calificado'){echo $promVal>=90?'Excelente':($promVal>=80?'Muy Bueno':($promVal>=70?'Bueno':'Reprobado'));}else{echo'Pendiente';}?>
                </span>
              </td>
              <td><textarea class="obs-input" name="notas[<?=$idE?>][obs]" rows="1" placeholder="Comentario opcional..." <?=!empty($bloqueadoPor48h)?'disabled':''?>><?=htmlspecialchars($obsVal??'')?></textarea></td>
            </tr>
            <?php endforeach;?>
          </tbody>
        </table>
        </div>
        <?php if($totalCalificados>0):
          $promedios=array_filter(array_column($calificacionesMapa,'nota_promedio'),fn($v)=>$v!==null);
          $promGrupo=count($promedios)>0?round(array_sum($promedios)/count($promedios),2):null;
        ?>
        <div style="background:#faf5ff;border:1px solid #ddd6fe;border-radius:10px;padding:14px 20px;margin-top:16px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:12px">
          <div><div style="font-size:12px;color:#7c3aed;font-weight:700">PROMEDIO GENERAL DEL GRUPO</div><div style="font-size:11px;color:#a78bfa"><?=count($promedios)?>/<?=$totalMiembros?> estudiantes calificados</div></div>
          <div style="font-size:32px;font-weight:800;color:<?=$promGrupo>=70?'#16a34a':'#ef4444'?>"><?=$promGrupo!==null?number_format($promGrupo,1):'—'?><span style="font-size:14px;font-weight:400;color:#a78bfa"> / 100</span></div>
        </div>
        <?php endif;?>
        <div style="display:flex;justify-content:flex-end;margin-top:18px;gap:10px">
          <a href="vinculacion.php?grupo=<?=$idGrupoVer?>" class="btn btn-outline-secondary btn-sm">Cancelar</a>
          <?php if(!empty($bloqueadoPor48h)): ?>
          <button type="button" class="save-btn-main" disabled
                  style="opacity:.5;cursor:not-allowed;background:#94a3b8;border-color:#94a3b8;">
            <i class="fa fa-lock me-2"></i>Calificación bloqueada
          </button>
          <?php else: ?>
          <button type="submit" class="save-btn-main" onclick="return confirm('Guardar calificaciones?')">
            <i class="fa fa-floppy-disk me-2"></i>Guardar calificaciones
          </button>
          <?php endif; ?>
        </div>

        <?php if(!empty($bloqueadoPor48h)): ?>
        <!-- Mensaje bloqueado -->
        <div style="background:#fff1f0;border:1px solid #fecaca;border-radius:10px;
                    padding:14px 18px;margin-top:12px;display:flex;align-items:center;gap:12px;">
          <i class="fa fa-lock" style="color:#ef4444;font-size:22px;flex-shrink:0;"></i>
          <div>
            <div style="font-size:13px;font-weight:700;color:#b91c1c;">
              Ventana de corrección cerrada
            </div>
            <div style="font-size:12px;color:#dc2626;margin-top:2px;">
              Las 48 horas para corregir calificaciones han expirado. Si necesitas realizar cambios, contacta al administrador del sistema.
            </div>
          </div>
        </div>
        <?php elseif(!empty($segundosRestantes) && $segundosRestantes > 0): ?>
        <!-- Contador regresivo 48h -->
        <div style="background:#fffbeb;border:1px solid #fde68a;border-radius:10px;
                    padding:14px 18px;margin-top:12px;display:flex;align-items:center;
                    justify-content:space-between;flex-wrap:wrap;gap:10px;">
          <div style="display:flex;align-items:center;gap:10px;">
            <i class="fa fa-clock" style="color:#d97706;font-size:20px;flex-shrink:0;"></i>
            <div>
              <div style="font-size:13px;font-weight:700;color:#92400e;">
                Tienes 48 horas para corregir las calificaciones
              </div>
              <div style="font-size:12px;color:#b45309;margin-top:2px;">
                Una vez vencido el plazo, las calificaciones quedarán bloqueadas permanentemente.
              </div>
            </div>
          </div>
          <div style="text-align:center;flex-shrink:0;">
            <div id="contador48h" style="font-size:26px;font-weight:800;color:#d97706;
                                         font-family:'JetBrains Mono',monospace;letter-spacing:2px;">
              --:--:--
            </div>
            <div style="font-size:10px;color:#92400e;font-weight:600;">TIEMPO RESTANTE</div>
          </div>
        </div>
        <script>
        (function(){
          var fin = <?= (strtotime($primeraCalif ?? 'now') + 48*3600) * 1000 ?>;
          function tick(){
            var ahora = Date.now();
            var diff  = Math.max(0, Math.floor((fin - ahora) / 1000));
            if(diff <= 0){
              document.getElementById('contador48h').textContent = '00:00:00';
              // Recargar para bloquear el form
              location.reload();
              return;
            }
            var h = Math.floor(diff / 3600);
            var m = Math.floor((diff % 3600) / 60);
            var s = diff % 60;
            document.getElementById('contador48h').textContent =
              String(h).padStart(2,'0') + ':' +
              String(m).padStart(2,'0') + ':' +
              String(s).padStart(2,'0');
          }
          tick();
          setInterval(tick, 1000);
        })();
        </script>
        <?php endif; ?>
      </form>
    </div>
  </div>
  <?php endif;?>

<?php else:
  // ═══ VISTA LISTA DE GRUPOS ═══
?>
  <div class="page-header">
    <h4><i class="fa fa-handshake me-2" style="color:#10b981"></i>Mis Grupos de Vinculacion</h4>
    <p>Grupos comunitarios asignados a tu tutoria</p>
  </div>
  <?=flashHtml()?>

  <div class="row g-3 mb-4">
    <div class="col-6 col-lg-3"><div class="stat-card"><div><div class="stat-num" style="color:#3b82f6"><?=$totalRegistros?></div><div class="stat-label">Total grupos</div></div><div class="stat-icon">🤝</div></div></div>
    <div class="col-6 col-lg-3"><div class="stat-card"><div><div class="stat-num" style="color:#f59e0b"><?=$totalBitPend?></div><div class="stat-label">Bitacoras pendientes</div></div><div class="stat-icon">📬</div></div></div>
    <div class="col-6 col-lg-3"><div class="stat-card"><div><div class="stat-num" style="color:#16a34a"><?=$totalBitVal?></div><div class="stat-label">Bitacoras validadas</div></div><div class="stat-icon">✅</div></div></div>
    <div class="col-6 col-lg-3"><div class="stat-card"><div><div class="stat-num" style="color:#ef4444"><?=$totalInformesRev?></div><div class="stat-label">Informes por revisar</div></div><div class="stat-icon">📋</div></div></div>
  </div>

  <?php if(!empty($bitPendientes)):?>
  <div style="background:#fffbeb;border:1px solid #fde68a;border-radius:12px;padding:18px;margin-bottom:24px">
    <div style="font-size:13px;font-weight:700;color:#92400e;margin-bottom:12px"><i class="fa fa-clock me-2"></i>Bitacoras pendientes de validacion (<?=$totalBitPend?>)</div>
    <?php foreach($bitPendientes as $bp):?>
    <div style="display:flex;justify-content:space-between;align-items:center;background:#fff;border:1px solid #fde68a;border-radius:8px;padding:10px 14px;margin-bottom:8px;gap:12px;flex-wrap:wrap">
      <div>
        <div style="font-weight:600;font-size:13px;color:#0f172a"><?=htmlspecialchars($bp['nombre_proyecto'])?> — <span style="color:#3b82f6">Semana <?=$bp['semana_numero']?></span></div>
        <div style="font-size:12px;color:#64748b;margin-top:2px"><i class="fa fa-building me-1"></i><?=htmlspecialchars($bp['organizacion'])?> &nbsp;·&nbsp; <?=$bp['total_secciones']?> secciones &nbsp;·&nbsp; <?=$bp['horas_totales_grupo']?>h &nbsp;·&nbsp; Lider: <?=htmlspecialchars($bp['lider_nombre'])?></div>
      </div>
      <a href="vinculacion.php?bit=<?=$bp['id_bitacora']?>" class="btn btn-primary btn-sm"><i class="fa fa-gavel me-1"></i>Revisar y validar</a>
    </div>
    <?php endforeach;?>
  </div>
  <?php endif;?>

  <!-- ── Filtros ── -->
  <form method="GET" action="vinculacion.php" class="filtros-bar">
    <div>
      <label>Ciclo / Período</label>
      <select name="periodo">
        <option value="">Período activo</option>
        <?php foreach($periodos as $p):?>
          <option value="<?=$p['id_periodo']?>" <?=$filtroPeriodo==$p['id_periodo']?'selected':''?>><?=htmlspecialchars($p['nombre'])?></option>
        <?php endforeach;?>
      </select>
    </div>
    <div>
      <label>Carrera (líder)</label>
      <select name="carrera">
        <option value="">Todas las carreras</option>
        <?php foreach($carreras as $c):?>
          <option value="<?=$c['id_carrera']?>" <?=$filtroCarrera==$c['id_carrera']?'selected':''?>><?=htmlspecialchars($c['nombre'])?></option>
        <?php endforeach;?>
      </select>
    </div>
    <div>
      <label>Estado</label>
      <select name="estado">
        <option value="">Todos</option>
        <option value="aprobado"    <?=$filtroEstado==='aprobado'   ?'selected':''?>>Aprobado</option>
        <option value="en_progreso" <?=$filtroEstado==='en_progreso'?'selected':''?>>En progreso</option>
        <option value="completado"  <?=$filtroEstado==='completado' ?'selected':''?>>Completado</option>
      </select>
    </div>
    <div>
      <label>Mostrar</label>
      <select name="pp">
        <?php foreach([10,25,50,100] as $n):?>
          <option value="<?=$n?>" <?=$porPagina==$n?'selected':''?>><?=$n?> por página</option>
        <?php endforeach;?>
      </select>
    </div>
    <input type="hidden" name="pag" value="1">
    <button type="submit" class="btn-filtrar"><i class="fa fa-filter me-1"></i>Filtrar</button>
    <a href="vinculacion.php" class="btn-limpiar"><i class="fa fa-xmark me-1"></i>Limpiar</a>
  </form>

  <?php if(empty($grupos)):?>
  <div style="background:#fff;border:2px dashed #e2e8f0;border-radius:12px;padding:48px;text-align:center;color:#94a3b8">
    <div style="font-size:36px;margin-bottom:12px">🤝</div>
    <div style="font-size:14px;font-weight:600;color:#64748b">No hay grupos con los filtros seleccionados.</div>
  </div>
  <?php else:?>
  <div style="font-size:12px;color:#64748b;font-weight:700;text-transform:uppercase;letter-spacing:.6px;margin-bottom:12px">
    Grupos (<?=$totalRegistros?> en total)
  </div>
  <?php foreach($grupos as $g):
    $horasReqG=(int)($g['horas_requeridas_carrera']??$g['horas_requeridas']);
    $pctG=$horasReqG>0?min(100,round($g['horas_cumplidas']/$horasReqG*100)):0;
    $pcG=$pctG>=80?'#16a34a':($pctG>=40?'#d97706':'#3b82f6');
    $ecG=$eColor[$g['estado']]??'#64748b';
    $bitPendG=count(array_filter($bitPendientes,fn($b)=>$b['id_grupo']==$g['id_grupo']));
    $infEst=$informesPorGrupo[$g['id_grupo']]??null;
    $infBadge='';
    if($infEst==='pendiente_revision') $infBadge='<span style="font-size:10px;padding:2px 9px;border-radius:20px;font-weight:700;background:#fef3c7;color:#d97706;border:1px solid #fde68a;white-space:nowrap"><i class="fa fa-magnifying-glass me-1"></i>Informe en revision</span>';
    elseif($infEst==='observado') $infBadge='<span style="font-size:10px;padding:2px 9px;border-radius:20px;font-weight:700;background:#fff1f0;color:#ef4444;border:1px solid #fecaca;white-space:nowrap"><i class="fa fa-comment me-1"></i>Informe observado</span>';
    elseif($infEst==='aprobado') $infBadge='<span style="font-size:10px;padding:2px 9px;border-radius:20px;font-weight:700;background:#f0fdf4;color:#16a34a;border:1px solid #bbf7d0;white-space:nowrap"><i class="fa fa-circle-check me-1"></i>Informe aprobado</span>';
    $esBloqueado=$g['estado']==='completado'?'<span style="font-size:10px;padding:2px 9px;border-radius:20px;font-weight:700;background:#faf5ff;color:#7c3aed;border:1px solid #ddd6fe;white-space:nowrap"><i class="fa fa-graduation-cap me-1"></i>Listo para calificar</span>':'';
  ?>
  <div class="grupo-card" style="<?=$g['estado']==='completado'?'border-color:#ddd6fe;':''?>">
    <div class="d-flex justify-content-between align-items-start gap-2 flex-wrap mb-3">
      <div style="flex:1;min-width:0">
        <div style="display:flex;align-items:center;gap:8px;flex-wrap:wrap">
          <h6 style="font-size:15px;font-weight:700;color:#0f172a;margin:0"><?=htmlspecialchars($g['nombre_proyecto'])?></h6>
          <?php if($bitPendG>0):?><span class="pend-badge"><i class="fa fa-clock me-1"></i><?=$bitPendG?> pendiente<?=$bitPendG>1?'s':''?></span><?php endif;?>
          <?php if($infBadge): echo $infBadge; endif;?>
          <?php if($esBloqueado): echo $esBloqueado; endif;?>
        </div>
        <div style="font-size:13px;color:#64748b;margin-top:3px"><i class="fa fa-building me-1"></i><?=htmlspecialchars($g['organizacion'])?><?=$g['org_canton']?' &middot; '.htmlspecialchars($g['org_canton']):''?></div>
        <div style="font-size:12px;color:#94a3b8;margin-top:2px"><i class="fa fa-calendar me-1"></i><?=htmlspecialchars($g['periodo_nombre'])?> &nbsp;·&nbsp; <i class="fa fa-users me-1"></i><?=$g['total_miembros']?> integrantes &nbsp;·&nbsp; Lider: <?=htmlspecialchars($g['lider_nombre'])?></div>
      </div>
      <span style="font-size:11px;padding:3px 12px;border-radius:20px;font-weight:700;background:<?=$ecG?>18;color:<?=$ecG?>;border:1px solid <?=$ecG?>44;white-space:nowrap">&#9679; <?=ucfirst($g['estado'])?></span>
    </div>
    <div style="margin-bottom:12px">
      <div style="display:flex;justify-content:space-between;font-size:11px;color:#94a3b8;margin-bottom:4px"><span>Progreso horas</span><span style="font-weight:700;color:<?=$pcG?>"><?=$pctG?>% &nbsp; (<?=$g['horas_cumplidas']?>/<?=$horasReqG?>h)</span></div>
      <div style="background:#e2e8f0;border-radius:4px;height:6px"><div style="width:<?=$pctG?>%;height:6px;border-radius:4px;background:<?=$pcG?>"></div></div>
    </div>
    <a href="vinculacion.php?grupo=<?=$g['id_grupo']?>" class="btn btn-sm <?=$g['estado']==='completado'?'btn-outline-primary':'btn-outline-secondary'?>">
      <i class="fa fa-<?=$g['estado']==='completado'?'graduation-cap':'eye'?> me-1"></i>
      <?=$g['estado']==='completado'?'Ver grupo y calificar':'Ver grupo y bitacoras'?>
    </a>
  </div>
  <?php endforeach;?>

  <!-- Paginación -->
  <?php if($totalRegistros>0):?>
  <div class="paginacion">
    <div class="pag-info">
      Mostrando <?=(($pagina-1)*$porPagina)+1?>–<?=min($pagina*$porPagina,$totalRegistros)?> de <?=$totalRegistros?> grupos &nbsp;|&nbsp;
      <select class="pp-sel" onchange="cambiarPP(this.value)">
        <?php foreach([10,25,50,100] as $n):?>
          <option value="<?=$n?>" <?=$porPagina==$n?'selected':''?>><?=$n?>/pág</option>
        <?php endforeach;?>
      </select>
    </div>
    <div class="pag-btns">
      <a class="pag-btn <?=$pagina<=1?'disabled':''?>" href="<?=urlVinc(['pag'=>$pagina-1])?>"><i class="fa fa-chevron-left fa-xs"></i></a>
      <?php
        $ini=max(1,$pagina-2);$fin=min($totalPaginas,$pagina+2);
        if($ini>1) echo '<a class="pag-btn" href="'.urlVinc(['pag'=>1]).'">1</a>';
        if($ini>2) echo '<span class="pag-btn disabled">…</span>';
        for($p=$ini;$p<=$fin;$p++) echo '<a class="pag-btn'.($p==$pagina?' active':'').'" href="'.urlVinc(['pag'=>$p]).'">'.$p.'</a>';
        if($fin<$totalPaginas-1) echo '<span class="pag-btn disabled">…</span>';
        if($fin<$totalPaginas) echo '<a class="pag-btn" href="'.urlVinc(['pag'=>$totalPaginas]).'">'.$totalPaginas.'</a>';
      ?>
      <a class="pag-btn <?=$pagina>=$totalPaginas?'disabled':''?>" href="<?=urlVinc(['pag'=>$pagina+1])?>"><i class="fa fa-chevron-right fa-xs"></i></a>
    </div>
  </div>
  <?php endif;?>
  <?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>
function cambiarPP(val){
  var url=new URL(window.location.href);
  url.searchParams.set('pp',val);url.searchParams.set('pag','1');
  window.location.href=url.toString();
}
function calcProm(idEst){
  var n1=parseFloat(document.getElementById('n1_'+idEst).value);
  var n2=parseFloat(document.getElementById('n2_'+idEst).value);
  var pElem=document.getElementById('prom_'+idEst);
  var eElem=document.getElementById('est_'+idEst);
  if(isNaN(n1)||isNaN(n2)){
    pElem.textContent='—';pElem.className='promedio-badge pendiente-bg';
    eElem.textContent='Pendiente';eElem.style.cssText='font-size:10px;padding:2px 8px;border-radius:20px;font-weight:700;background:#f8fafc;color:#94a3b8;border:1px solid #e2e8f0';
    return;
  }
  n1=Math.min(100,Math.max(0,n1));n2=Math.min(100,Math.max(0,n2));
  var prom=Math.round((n1+n2)/2*10)/10;
  pElem.textContent=prom.toFixed(1);
  var label=prom>=90?'Excelente':prom>=80?'Muy Bueno':prom>=70?'Bueno':'Reprobado';
  eElem.textContent=label;
  if(prom>=70){pElem.className='promedio-badge aprobado-bg';eElem.style.cssText='font-size:10px;padding:2px 8px;border-radius:20px;font-weight:700;background:#f0fdf4;color:#16a34a;border:1px solid #bbf7d0';}
  else{pElem.className='promedio-badge reprobado-bg';eElem.style.cssText='font-size:10px;padding:2px 8px;border-radius:20px;font-weight:700;background:#fff1f0;color:#ef4444;border:1px solid #fecaca';}
}
</script>
</body></html>