"use server";

import { revalidatePath } from "next/cache";
import { hasPermission } from "@/lib/adminAuth";
import { getSessionClientId } from "@/lib/auth";
import { connectDB } from "@/lib/db";
import { CharacterWish } from "@/models/CharacterWish";
import { notifyStaffWithPermission } from "@/lib/notifications";
import { isWishStatus } from "@/lib/characterWishStatus";

type FormState = { error?: string };

export async function submitCharacterWishAction(_prev: FormState, formData: FormData): Promise<FormState> {
  const clientId = await getSessionClientId();
  if (!clientId) return { error: "Bitte logge dich ein." };

  const character = String(formData.get("character") || "").trim();
  if (!character) return { error: "Bitte einen Charakter oder ein Konzept eingeben." };

  await connectDB();
  await CharacterWish.create({
    clientId,
    character,
    fandom: String(formData.get("fandom") || "").trim(),
    note: String(formData.get("note") || "").trim(),
  });

  await notifyStaffWithPermission("orders_view", {
    type: "new_message_for_staff",
    title: `Neuer Wunsch — ${character}`,
    body: "Neuer Eintrag in der Charakter-Wunschliste.",
    link: "/de/admin/wishlist",
  });

  revalidatePath("/[locale]/account/wishlist", "page");
  revalidatePath("/de/admin/wishlist");
  return {};
}

export async function deleteCharacterWishAction(wishId: string) {
  const clientId = await getSessionClientId();
  if (!clientId) return;
  await connectDB();
  await CharacterWish.deleteOne({ _id: wishId, clientId });
  revalidatePath("/[locale]/account/wishlist", "page");
  revalidatePath("/de/admin/wishlist");
}

export async function adminDeleteCharacterWishAction(wishId: string) {
  if (!(await hasPermission("orders_edit"))) return;
  await connectDB();
  await CharacterWish.findByIdAndDelete(wishId);
  revalidatePath("/de/admin/wishlist");
}

export async function updateCharacterWishStatusAction(wishId: string, status: string) {
  if (!(await hasPermission("orders_edit"))) return;
  if (!isWishStatus(status)) return;
  await connectDB();
  await CharacterWish.findByIdAndUpdate(wishId, { status });
  revalidatePath("/de/admin/wishlist");
  revalidatePath("/[locale]/account/wishlist", "page");
}
