"use server";
import { db } from '@/lib/db';
import { clase } from '@/db/schema';
import { eq } from 'drizzle-orm';
import { revalidatePath } from "next/cache";
import { getServerSession } from "next-auth";
import { authOptions } from "@/lib/auth";
import crypto from "crypto";

async function checkClaseAuth(claseId?: string, colegioId?: string) {
  const session = await getServerSession(authOptions);
  if (!session || (session.user.role !== "SUPERADMIN" && session.user.role !== "ADMIN_COLEGIO" && session.user.role !== "PROFESOR")) {
    throw new Error("No autorizado");
  }

  if (session.user.role === "SUPERADMIN") return session;

  // If we are checking an existing class
  if (claseId) {
    const foundClase = await db.query.clase.findFirst({
      where: eq(clase.id, claseId),
      columns: { colegioId: true }
    });
    if (!foundClase || foundClase.colegioId !== session.user.colegioId) {
      throw new Error("No autorizado para este colegio");
    }
  }

  // If we are creating a new class, check the colegioId
  if (colegioId && session.user.role === "ADMIN_COLEGIO" && colegioId !== session.user.colegioId) {
    throw new Error("No autorizado para crear clases en este colegio");
  }

  return session;
}

export async function createClase(formData: FormData) {
  try {
    const cursoId    = formData.get("cursoId") as string;
    const colegioId  = formData.get("colegioId") as string;
    
    const session = await checkClaseAuth(undefined, colegioId);

    const titulo     = formData.get("titulo") as string;
    const descripcion = (formData.get("descripcion") as string) || null;
    const contenido  = (formData.get("contenido") as string) || null;
    const requisitos = (formData.get("requisitos") as string) || null;
    const modalidad  = (formData.get("modalidad") as string) || "MIXTA";
    const duracionHoras = parseFloat(formData.get("duracionHoras") as string) || 2;
    const materialesNecesarios = (formData.get("materialesNecesarios") as string) || null;
    const numero     = parseInt(formData.get("numero") as string) || 1;
    const fechaInicio = new Date(formData.get("fechaInicio") as string);
    const fechaFin   = new Date(formData.get("fechaFin") as string);

    // Enforce colegioId for non-superadmin
    const targetColegioId = session.user.role === "SUPERADMIN" ? colegioId : session.user.colegioId as string;

    await db.insert(clase).values({
      id: crypto.randomUUID(),
      cursoId,
      colegioId: targetColegioId,
      titulo,
      descripcion,
      contenido,
      requisitos,
      modalidad,
      duracionHoras,
      materialesNecesarios,
      numero,
      fechaInicio,
      fechaFin,
      updatedAt: new Date()
    });
    revalidatePath(`/dashboard/cursos`);
    return { success: true };
  } catch (error: any) {
    return { success: false, error: error.message || "Error al crear la clase." };
  }
}

export async function updateClase(id: string, formData: FormData) {
  try {
    await checkClaseAuth(id);

    const titulo     = formData.get("titulo") as string;
    const descripcion = (formData.get("descripcion") as string) || null;
    const contenido  = (formData.get("contenido") as string) || null;
    const requisitos = (formData.get("requisitos") as string) || null;
    const modalidad  = (formData.get("modalidad") as string) || "MIXTA";
    const duracionHoras = parseFloat(formData.get("duracionHoras") as string) || 2;
    const materialesNecesarios = (formData.get("materialesNecesarios") as string) || null;
    const numero     = parseInt(formData.get("numero") as string) || 1;
    const fechaInicio = new Date(formData.get("fechaInicio") as string);
    const fechaFin   = new Date(formData.get("fechaFin") as string);
    const estado     = (formData.get("estado") as string) || "PROGRAMADA";

    await db.update(clase)
      .set({
        titulo,
        descripcion,
        contenido,
        requisitos,
        modalidad,
        duracionHoras,
        materialesNecesarios,
        numero,
        fechaInicio,
        fechaFin,
        estado,
        updatedAt: new Date()
      })
      .where(eq(clase.id, id));
    revalidatePath(`/dashboard/cursos`);
    return { success: true };
  } catch (error: any) {
    return { success: false, error: error.message || "Error al actualizar la clase." };
  }
}

export async function deleteClase(id: string) {
  try {
    await checkClaseAuth(id);
    await db.update(clase)
      .set({
        activo: false,
        updatedAt: new Date()
      })
      .where(eq(clase.id, id));
    revalidatePath(`/dashboard/cursos`);
    return { success: true };
  } catch (error: any) {
    return { success: false, error: error.message || "Error al eliminar la clase." };
  }
}
