"use server";

import { revalidatePath } from "next/cache";
import { hasPermission } from "@/lib/adminAuth";
import { connectDB } from "@/lib/db";
import { FaqItem } from "@/models/FaqItem";

const FAQ_ADMIN_PATH = "/de/admin/faq";

type FormState = { error?: string };

export async function createFaqItemAction(_prev: FormState, formData: FormData): Promise<FormState> {
  if (!(await hasPermission("faq_create"))) return { error: "Keine Berechtigung." };
  const question = String(formData.get("question") || "").trim();
  const answer = String(formData.get("answer") || "").trim();
  if (!question) return { error: "Bitte eine Frage eingeben." };
  if (!answer) return { error: "Bitte eine Antwort eingeben." };

  await connectDB();
  await FaqItem.create({
    question,
    questionEn: String(formData.get("questionEn") || "").trim(),
    answer,
    answerEn: String(formData.get("answerEn") || "").trim(),
    category: String(formData.get("category") || "").trim() || "Allgemein",
    categoryEn: String(formData.get("categoryEn") || "").trim(),
    visible: formData.get("visible") === "on",
    sortOrder: Date.now(),
  });

  revalidatePath(FAQ_ADMIN_PATH);
  revalidatePath("/de/faq");
  revalidatePath("/en/faq");
  return {};
}

export async function updateFaqItemAction(itemId: string, formData: FormData) {
  if (!(await hasPermission("faq_edit"))) return;
  const question = String(formData.get("question") || "").trim();
  const answer = String(formData.get("answer") || "").trim();
  if (!question || !answer) return;

  await connectDB();
  // "visible" bewusst nicht Teil dieses Formulars — Sichtbarkeit läuft über
  // den separaten Schalter in der Zeilen-Übersicht (setFaqVisibleAction),
  // sonst würde jedes Speichern hier den Status unbeabsichtigt zurücksetzen.
  await FaqItem.findByIdAndUpdate(itemId, {
    question,
    questionEn: String(formData.get("questionEn") || "").trim(),
    answer,
    answerEn: String(formData.get("answerEn") || "").trim(),
    category: String(formData.get("category") || "").trim() || "Allgemein",
    categoryEn: String(formData.get("categoryEn") || "").trim(),
  });

  revalidatePath(FAQ_ADMIN_PATH);
  revalidatePath("/de/faq");
  revalidatePath("/en/faq");
}

export async function setFaqVisibleAction(itemId: string, visible: boolean) {
  if (!(await hasPermission("faq_edit"))) return;
  await connectDB();
  await FaqItem.findByIdAndUpdate(itemId, { visible });
  revalidatePath(FAQ_ADMIN_PATH);
  revalidatePath("/de/faq");
  revalidatePath("/en/faq");
}

export async function moveFaqItemAction(itemId: string, direction: "up" | "down") {
  if (!(await hasPermission("faq_edit"))) return;
  await connectDB();
  const item = await FaqItem.findById(itemId).lean();
  if (!item) return;

  const neighbor = await FaqItem.findOne(
    direction === "up" ? { sortOrder: { $lt: item.sortOrder } } : { sortOrder: { $gt: item.sortOrder } }
  )
    .sort({ sortOrder: direction === "up" ? -1 : 1 })
    .lean();
  if (!neighbor) return;

  await Promise.all([
    FaqItem.findByIdAndUpdate(item._id, { sortOrder: neighbor.sortOrder }),
    FaqItem.findByIdAndUpdate(neighbor._id, { sortOrder: item.sortOrder }),
  ]);
  revalidatePath(FAQ_ADMIN_PATH);
  revalidatePath("/de/faq");
  revalidatePath("/en/faq");
}

export async function deleteFaqItemAction(itemId: string) {
  if (!(await hasPermission("faq_delete"))) return;
  await connectDB();
  await FaqItem.findByIdAndDelete(itemId);
  revalidatePath(FAQ_ADMIN_PATH);
  revalidatePath("/de/faq");
  revalidatePath("/en/faq");
}
