import { db } from "@/lib/db";
import { curso, colegio, categoriamaster, user } from "@/db/schema";
import { eq, and } from "drizzle-orm";
import { getServerSession } from "next-auth";
import { authOptions } from "@/lib/auth";
import CursosListClient from "./CursosListClient";
import { getAdminCursosWithRelations } from "@/lib/mariadb-relations";

export const dynamic = "force-dynamic";

export default async function AdminCursos() {
  const session = await getServerSession(authOptions);
  const role = session?.user?.role;
  const colegioId = session?.user?.colegioId;

  const where =
    role === "ADMIN_COLEGIO" && colegioId
      ? and(eq(curso.activo, true), eq(curso.colegioId, colegioId))
      : eq(curso.activo, true);

  const rawCursos = await getAdminCursosWithRelations(where);
  rawCursos.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());

  const cursos = rawCursos.map((c) => ({
    ...c,
    inscritosCount: c.inscripcion.length,
    instructorIds: c.cursoinstructor.map((i) => i.instructorId),
    instructorNombres: c.cursoinstructor.map((i) => i.user?.name || "Sin nombre"),
    estudianteIds: c.inscripcion.map((ins) => ins.userId),
  }));

  const colegios =
    role === "ADMIN_COLEGIO" && colegioId
      ? await db.query.colegio.findMany({ where: eq(colegio.id, colegioId), columns: { id: true, nombre: true } })
      : await db.query.colegio.findMany({ columns: { id: true, nombre: true } });

  const categorias = await db.query.categoriamaster.findMany();
  categorias.sort((a, b) => a.nombre.localeCompare(b.nombre));

  const instructoresWhere =
    role === "ADMIN_COLEGIO" && colegioId
      ? and(eq(user.role, "PROFESOR"), eq(user.colegioId, colegioId))
      : eq(user.role, "PROFESOR");

  const instructores = await db.query.user.findMany({
    where: instructoresWhere,
    columns: { id: true, name: true, email: true, colegioId: true },
  });
  instructores.sort((a, b) => (a.name || "").localeCompare(b.name || ""));

  const estudiantesWhere =
    role === "ADMIN_COLEGIO" && colegioId
      ? and(eq(user.role, "ESTUDIANTE"), eq(user.status, "SOLVENTE"), eq(user.colegioId, colegioId))
      : and(eq(user.role, "ESTUDIANTE"), eq(user.status, "SOLVENTE"));

  const estudiantes = await db.query.user.findMany({
    where: estudiantesWhere,
    columns: { id: true, name: true, email: true, colegioId: true },
  });
  estudiantes.sort((a, b) => (a.name || "").localeCompare(b.name || ""));

  return (
    <CursosListClient
      cursos={cursos as any}
      colegios={colegios}
      categorias={categorias}
      instructores={instructores}
      estudiantes={estudiantes}
    />
  );
}
