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

export async function sendMessage(conversacionId: string, contenido: string) {
  const session = await getServerSession(authOptions);
  if (!session?.user) return { success: false, error: "No autenticado" };

  try {
    await db.insert(chatmensaje).values({
      id: crypto.randomUUID(),
      conversacionId,
      senderId: session.user.id,
      contenido
    });
    revalidatePath("/dashboard/chat");
    return { success: true };
  } catch (error: any) {
    return { success: false, error: error.message };
  }
}

export async function markChatRead(conversacionId: string) {
  const session = await getServerSession(authOptions);
  if (!session?.user) return { success: false };

  try {
    await db.update(chatmensaje)
      .set({ read: true, readAt: new Date() })
      .where(
        and(
          eq(chatmensaje.conversacionId, conversacionId),
          ne(chatmensaje.senderId, session.user.id),
          eq(chatmensaje.read, false)
        )
      );
    revalidatePath("/dashboard/chat");
    return { success: true };
  } catch {
    return { success: false };
  }
}

export async function createConversacion(profesorId: string, colegioId: string) {
  try {
    let conv = await db.query.chatconversacion.findFirst({
      where: and(
        eq(chatconversacion.colegioId, colegioId),
        eq(chatconversacion.profesorId, profesorId)
      )
    });

    let conversacionId = conv?.id;

    if (!conv) {
      const newId = crypto.randomUUID();
      await db.insert(chatconversacion).values({
        id: newId,
        colegioId,
        profesorId,
        updatedAt: new Date()
      });
      conversacionId = newId;
    }
    revalidatePath("/dashboard/chat");
    return { success: true, conversacionId };
  } catch (error: any) {
    return { success: false, error: error.message };
  }
}
