"use server";
import { db } from "@/lib/db";
import { colegio, user, curso, inscripcion, notificacion } from "@/db/schema";
import { eq, and, or, like } from "drizzle-orm";
import { getServerSession } from "next-auth";
import { authOptions } from "@/lib/auth";

export async function globalSearch(query: string) {
  const session = await getServerSession(authOptions);
  if (!session) return { success: false, error: "No autorizado" };

  const { role, colegioId } = session.user;
  const isSede = role === "ADMIN_COLEGIO" && colegioId;

  const q = query.toLowerCase();
  const qPattern = `%${q}%`;

  try {
    const [colegios, usuarios, cursos, inscripcionesRaw, notificaciones] = await Promise.all([
      // Colegios (Only for SUPERADMIN)
      role === "SUPERADMIN" 
        ? db.select().from(colegio).where(like(colegio.nombre, qPattern)).limit(5)
        : Promise.resolve([]),

      // Usuarios (Filtered by colegio if ADMIN_COLEGIO)
      db.select().from(user)
        .where(
          and(
            or(like(user.name, qPattern), like(user.email, qPattern), like(user.cedula, qPattern)),
            isSede ? eq(user.colegioId, colegioId as string) : undefined
          )
        )
        .limit(10),

      // Cursos (Filtered by colegio if ADMIN_COLEGIO)
      db.select().from(curso)
        .where(
          and(
            like(curso.titulo, qPattern),
            isSede ? eq(curso.colegioId, colegioId as string) : undefined
          )
        )
        .limit(10),

      // Pagos / Inscripciones (Join to search by user name)
      db.select({
        inscripcion: inscripcion,
        user: user,
        curso: curso
      })
        .from(inscripcion)
        .innerJoin(user, eq(inscripcion.userId, user.id))
        .innerJoin(curso, eq(inscripcion.cursoId, curso.id))
        .where(
          and(
            like(user.name, qPattern),
            isSede ? eq(curso.colegioId, colegioId as string) : undefined
          )
        )
        .limit(10),

      // Notificaciones
      db.select().from(notificacion)
        .where(
          and(
            like(notificacion.titulo, qPattern),
            isSede ? eq(notificacion.colegioId, colegioId as string) : undefined
          )
        )
        .limit(5)
    ]);

    // Map Join output to mimic Prisma's include structure
    const mappedInscripciones = inscripcionesRaw.map(row => ({
      ...row.inscripcion,
      user: row.user,
      curso: row.curso
    }));

    return {
      success: true,
      results: {
        colegios,
        usuarios,
        cursos,
        pagos: mappedInscripciones,
        notificaciones
      }
    };
  } catch (error) {
    console.error("Search error:", error);
    return { success: false, error: "Error en la búsqueda" };
  }
}
