"use server";

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

const PRICE_TEMPLATES_ADMIN_PATH = "/de/admin/price-templates";

type FormState = { error?: string };

export async function createPriceTemplateAction(_prev: FormState, formData: FormData): Promise<FormState> {
  if (!(await hasPermission("price_templates_create"))) return { error: "Keine Berechtigung." };
  const name = String(formData.get("name") || "").trim();
  const defaultAmount = Number(formData.get("defaultAmount"));
  if (!name) return { error: "Bitte einen Namen eingeben." };
  if (!Number.isFinite(defaultAmount) || defaultAmount <= 0) return { error: "Bitte einen gültigen Betrag eingeben." };

  await connectDB();
  await PriceTemplate.create({
    name,
    defaultAmount,
    note: String(formData.get("note") || "").trim(),
    sortOrder: Date.now(),
  });

  revalidatePath(PRICE_TEMPLATES_ADMIN_PATH);
  return {};
}

export async function updatePriceTemplateAction(templateId: string, formData: FormData) {
  if (!(await hasPermission("price_templates_edit"))) return;
  const name = String(formData.get("name") || "").trim();
  const defaultAmount = Number(formData.get("defaultAmount"));
  if (!name || !Number.isFinite(defaultAmount) || defaultAmount <= 0) return;

  await connectDB();
  await PriceTemplate.findByIdAndUpdate(templateId, {
    name,
    defaultAmount,
    note: String(formData.get("note") || "").trim(),
  });

  revalidatePath(PRICE_TEMPLATES_ADMIN_PATH);
}

export async function movePriceTemplateAction(templateId: string, direction: "up" | "down") {
  if (!(await hasPermission("price_templates_edit"))) return;
  await connectDB();
  const item = await PriceTemplate.findById(templateId).lean();
  if (!item) return;

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

  await Promise.all([
    PriceTemplate.findByIdAndUpdate(item._id, { sortOrder: neighbor.sortOrder }),
    PriceTemplate.findByIdAndUpdate(neighbor._id, { sortOrder: item.sortOrder }),
  ]);
  revalidatePath(PRICE_TEMPLATES_ADMIN_PATH);
}

export async function deletePriceTemplateAction(templateId: string) {
  if (!(await hasPermission("price_templates_delete"))) return;
  await connectDB();
  await PriceTemplate.findByIdAndDelete(templateId);
  revalidatePath(PRICE_TEMPLATES_ADMIN_PATH);
}
