"use server";

import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";
import { db } from "@/lib/db";
import { requireUser } from "@/lib/auth";
import { audit } from "@/lib/audit";

export async function toggleScheduleItem(sessionId: string) {
  const user = await requireUser();
  const existing = await db.scheduleItem.findUnique({
    where: { userId_sessionId: { userId: user.id, sessionId } },
  });
  if (existing) await db.scheduleItem.delete({ where: { id: existing.id } });
  else await db.scheduleItem.create({ data: { userId: user.id, sessionId } });
  revalidatePath("/me/schedule");
}

export async function markAllNotificationsRead() {
  const user = await requireUser();
  await db.notification.updateMany({ where: { userId: user.id, readAt: null }, data: { readAt: new Date() } });
  revalidatePath("/me/notifications");
}

export async function submitPaperAction(formData: FormData) {
  const user = await requireUser();
  const conferenceId = String(formData.get("conferenceId"));
  const conf = await db.conference.findUnique({ where: { id: conferenceId } });
  const err = (m: string) => redirect(`/me/submissions?error=${encodeURIComponent(m)}`);
  if (!conf || !conf.cfpOpen) err("That conference is not accepting submissions.");
  if (conf!.cfpDeadline && new Date() > conf!.cfpDeadline) err("The CFP deadline has passed.");
  const title = String(formData.get("title") || "").trim();
  const abstract = String(formData.get("abstract") || "").trim();
  if (title.length < 5) err("Title is too short.");
  if (abstract.length < 30) err("Abstract should be at least 30 characters.");

  await db.submission.create({
    data: {
      conferenceId,
      userId: user.id,
      title,
      abstract,
      category: String(formData.get("category") || "PAPER"),
      keywords: String(formData.get("keywords") || "") || null,
      coAuthors: String(formData.get("coAuthors") || "") || null,
      status: "SUBMITTED",
    },
  });
  await audit({ userId: user.id, conferenceId, action: "submission.create", meta: { title } });
  redirect("/me/submissions?submitted=1");
}

export async function submitReviewAction(formData: FormData) {
  const user = await requireUser();
  const reviewId = String(formData.get("reviewId"));
  const review = await db.review.findUnique({ where: { id: reviewId }, include: { submission: true } });
  if (!review || review.reviewerId !== user.id) redirect("/me/reviews");
  const score = Math.min(10, Math.max(1, parseInt(String(formData.get("score") || "5"), 10) || 5));
  await db.review.update({
    where: { id: reviewId },
    data: {
      score,
      comments: String(formData.get("comments") || "") || null,
      recommendation: String(formData.get("recommendation") || "WEAK_ACCEPT"),
      status: "COMPLETED",
    },
  });
  await audit({ userId: user.id, conferenceId: review.submission.conferenceId, action: "review.complete", entityId: reviewId, meta: { score } });
  revalidatePath("/me/reviews");
}
