"use server";

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

const BUNDLES_ADMIN_PATH = "/de/admin/bundles";

type FormState = { error?: string };

function revalidateBundlePaths() {
  revalidatePath(BUNDLES_ADMIN_PATH);
  revalidatePath("/de/angebote");
  revalidatePath("/en/angebote");
}

export async function createBundleAction(_prev: FormState, formData: FormData): Promise<FormState> {
  if (!(await hasPermission("bundles_create"))) return { error: "Keine Berechtigung." };
  const title = String(formData.get("title") || "").trim();
  const price = Number(formData.get("price"));
  if (!title) return { error: "Bitte einen Titel eingeben." };
  if (!Number.isFinite(price) || price <= 0) return { error: "Bitte einen gültigen Preis eingeben." };

  await connectDB();
  await Bundle.create({
    title,
    titleEn: String(formData.get("titleEn") || "").trim(),
    description: String(formData.get("description") || "").trim(),
    descriptionEn: String(formData.get("descriptionEn") || "").trim(),
    price,
    compareAtPrice: Number(formData.get("compareAtPrice")) || 0,
    active: formData.get("active") === "on",
    sortOrder: Date.now(),
  });

  revalidateBundlePaths();
  return {};
}

export async function updateBundleAction(bundleId: string, formData: FormData) {
  if (!(await hasPermission("bundles_edit"))) return;
  const title = String(formData.get("title") || "").trim();
  const price = Number(formData.get("price"));
  if (!title || !Number.isFinite(price) || price <= 0) return;

  await connectDB();
  await Bundle.findByIdAndUpdate(bundleId, {
    title,
    titleEn: String(formData.get("titleEn") || "").trim(),
    description: String(formData.get("description") || "").trim(),
    descriptionEn: String(formData.get("descriptionEn") || "").trim(),
    price,
    compareAtPrice: Number(formData.get("compareAtPrice")) || 0,
  });

  revalidateBundlePaths();
}

export async function setBundleActiveAction(bundleId: string, active: boolean) {
  if (!(await hasPermission("bundles_edit"))) return;
  await connectDB();
  await Bundle.findByIdAndUpdate(bundleId, { active });
  revalidateBundlePaths();
}

export async function moveBundleAction(bundleId: string, direction: "up" | "down") {
  if (!(await hasPermission("bundles_edit"))) return;
  await connectDB();
  const item = await Bundle.findById(bundleId).lean();
  if (!item) return;

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

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

export async function deleteBundleAction(bundleId: string) {
  if (!(await hasPermission("bundles_delete"))) return;
  await connectDB();
  await Bundle.findByIdAndDelete(bundleId);
  revalidateBundlePaths();
}
