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

export const dynamic = "force-dynamic";

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

  const isSede = role === "ADMIN_COLEGIO" && colegioId;

  let rawUsuarios = await getUsersWithInscripcionCursoIds(eq(user.activo, true));

  // Filtrar por colegio si corresponde
  if (isSede) {
    // Obtener todos los cursoIds del colegio
    const cursosDeColegio = await db.query.curso.findMany({
      where: eq(curso.colegioId, colegioId as string),
      columns: { id: true }
    });
    const cursoIdsDelColegio = new Set(cursosDeColegio.map(c => c.id));

    rawUsuarios = rawUsuarios.filter(u =>
      u.colegioId === colegioId ||
      u.inscripcion.some(ins => cursoIdsDelColegio.has(ins.cursoId))
    );
  } else if (role !== "SUPERADMIN") {
    rawUsuarios = rawUsuarios.filter(u => u.role === "ESTUDIANTE");
  }

  // Ordenar por fecha de creación descendente
  rawUsuarios.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime());

  const usuarios = rawUsuarios.map((u: any) => ({
    ...u,
    colegioId: u.colegioId,
    cursoIds: u.inscripcion.map((ins: any) => ins.cursoId),
  }));

  // Cursos
  const cursosWhere = isSede ? eq(curso.colegioId, colegioId as string) : undefined;
  const cursos = await db.query.curso.findMany({
    where: cursosWhere,
    columns: { id: true, titulo: true, colegioId: true },
  });
  cursos.sort((a, b) => a.titulo.localeCompare(b.titulo));

  // Colegios
  const colegiosWhere = isSede ? eq(colegio.id, colegioId as string) : undefined;
  const colegios = await db.query.colegio.findMany({
    where: colegiosWhere,
    columns: { id: true, nombre: true },
  });

  return (
    <UsuariosListClient usuarios={usuarios} cursos={cursos} colegios={colegios} />
  );
}
