import { getServerSession } from "next-auth";
import { authOptions } from "@/lib/auth";
import { db } from "@/lib/db";
import { curso } from "@/db/schema";
import { eq, notInArray } from "drizzle-orm";
import { getInscripcionesWithCursoAndColegio, getCursosWithColegio } from "@/lib/mariadb-relations";
import { redirect } from "next/navigation";
import EstudianteLayoutClient from "./EstudianteLayoutClient";


export default async function EstudiantePage() {
  const session = await getServerSession(authOptions);
  if (!session?.user?.id) redirect("/api/auth/signin");

  const user = await db.query.user.findFirst({
    where: (u, { eq }) => eq(u.id, session.user.id),
  });

  if (!user) redirect("/api/auth/signin");

  const inscripciones = await getInscripcionesWithCursoAndColegio(user.id);

  // Buscar el colegio del estudiante si está asignado (o podemos mostrar todos los cursos disponibles en el sistema)
  // Según requerimiento: "Ver los cursos que están registrados ellos, adicional pueden ver los que NO están registrados"
  
  // Lista de ID de cursos en los que ya está inscrito (o con solicitud enviada)
  const inscritosIds = inscripciones.map((ins) => ins.cursoId);

  // Todo el catálogo de cursos disponibles que NO estén en su lista (Activos)
  const cursosDisponiblesRaw = (
    await getCursosWithColegio(
      inscritosIds.length > 0 ? notInArray(curso.id, inscritosIds) : undefined
    )
  ).sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());

  const cursosDisponibles = cursosDisponiblesRaw.map((curso: any) => ({
    id: curso.id,
    titulo: curso.titulo,
    colegioId: curso.colegioId,
    colegio: curso.colegio
  }));

  // Los cursos en los que está inscrito o en proceso, con su estado de pago y detalle
  const misCursos = inscripciones.map((ins: any) => ({
    inscripcionId: ins.id,
    cursoId: ins.curso.id,
    titulo: ins.curso.titulo,
    colegioNombre: ins.curso.colegio.nombre,
    fechaInicio: ins.curso.fechaInicio ? ins.curso.fechaInicio.toISOString() : null,
    estadoFlujo: ins.estadoFlujo,
    estadoPago: ins.estadoPago
  }));

  return (
    <EstudianteLayoutClient 
      user={{ id: user.id, name: user.name, email: user.email, telefono: user.telefono, status: user.status }} 
      misCursos={misCursos} 
      cursosDisponibles={cursosDisponibles} 
    />
  );
}
