"use server";

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

const TESTIMONIALS_ADMIN_PATH = "/de/admin/testimonials";

type FormState = { error?: string };

function revalidateQuickReviewPaths() {
  revalidatePath(TESTIMONIALS_ADMIN_PATH);
  revalidatePath("/de");
  revalidatePath("/en");
}

export async function createQuickReviewAction(_prev: FormState, formData: FormData): Promise<FormState> {
  if (!(await hasPermission("testimonials_create"))) return { error: "Keine Berechtigung." };
  const authorName = String(formData.get("authorName") || "").trim();
  const rating = Number(formData.get("rating"));
  if (!authorName) return { error: "Bitte einen Namen eingeben." };
  if (!Number.isInteger(rating) || rating < 1 || rating > 5) return { error: "Bitte eine Sternebewertung von 1 bis 5 wählen." };

  await connectDB();
  await QuickReview.create({
    authorName,
    rating,
    visible: formData.get("visible") === "on",
    sortOrder: Date.now(),
  });

  revalidateQuickReviewPaths();
  return {};
}

export async function updateQuickReviewAction(itemId: string, formData: FormData) {
  if (!(await hasPermission("testimonials_edit"))) return;
  const authorName = String(formData.get("authorName") || "").trim();
  const rating = Number(formData.get("rating"));
  if (!authorName || !Number.isInteger(rating) || rating < 1 || rating > 5) return;

  await connectDB();
  // "visible" bewusst nicht Teil dieses Formulars — Sichtbarkeit läuft über
  // den separaten Schalter in der Zeilen-Übersicht, gleiches Muster wie bei
  // Testimonials/FAQ/Conventions.
  await QuickReview.findByIdAndUpdate(itemId, { authorName, rating });
  revalidateQuickReviewPaths();
}

export async function setQuickReviewVisibleAction(itemId: string, visible: boolean) {
  if (!(await hasPermission("testimonials_edit"))) return;
  await connectDB();
  await QuickReview.findByIdAndUpdate(itemId, { visible });
  revalidateQuickReviewPaths();
}

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

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

  await Promise.all([
    QuickReview.findByIdAndUpdate(item._id, { sortOrder: neighbor.sortOrder }),
    QuickReview.findByIdAndUpdate(neighbor._id, { sortOrder: item.sortOrder }),
  ]);
  revalidateQuickReviewPaths();
}

export async function deleteQuickReviewAction(itemId: string) {
  if (!(await hasPermission("testimonials_delete"))) return;
  await connectDB();
  await QuickReview.findByIdAndDelete(itemId);
  revalidateQuickReviewPaths();
}
