"use server";
import { revalidatePath } from "next/cache";
import { z } from "zod";
import { requireStaff } from "@/lib/auth";
import { db } from "@/lib/db";
import { audit } from "@/lib/audit";

const slugify = (s: string) => s.toLowerCase().replace(/[^a-z0-9-]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 80);
const RESERVED = new Set(["admin", "api", "shop", "cart", "checkout", "order", "track", "account", "wishlist", "journal", "collections", "products", "search", "contact", "faq", "media", "sitemap.xml", "robots.txt", "login"]);
const done = () => { revalidatePath("/", "layout"); revalidatePath("/admin/pages"); };

export async function savePage(fd: FormData) {
  const u = await requireStaff(fd.get("status") === "PUBLISHED" ? "content.publish" : "content.edit");
  const d = z.object({ id: z.string().optional(), title: z.string().trim().min(2), slug: z.string().trim().min(2), intro: z.string().optional(), body: z.string(), status: z.enum(["DRAFT", "PUBLISHED"]), seoTitle: z.string().optional(), seoDesc: z.string().max(320).optional() }).parse(Object.fromEntries(fd));
  const slug = slugify(d.slug);
  if (RESERVED.has(slug)) throw new Error(`“${slug}” is reserved for a built-in page. Choose another slug.`);
  const data = { title: d.title, slug, intro: d.intro || null, body: d.body, status: d.status, seoTitle: d.seoTitle || null, seoDesc: d.seoDesc || null };
  const p = d.id ? await db.page.update({ where: { id: d.id }, data }) : await db.page.create({ data });
  await audit(u.id, d.id ? "page.update" : "page.create", "Page", p.id); done();
}
export async function deletePage(fd: FormData) {
  const u = await requireStaff("content.publish");
  const p = await db.page.findUniqueOrThrow({ where: { id: String(fd.get("id")) } });
  if (p.system) throw new Error("Built-in pages can be edited but not deleted. Set them to draft to hide them.");
  await db.page.delete({ where: { id: p.id } }); await audit(u.id, "page.delete", "Page", p.id); done();
}
export async function saveFaq(fd: FormData) {
  const u = await requireStaff("content.edit");
  const d = z.object({ id: z.string().optional(), group: z.string().trim().min(1), question: z.string().trim().min(3), answer: z.string().trim().min(3), sortOrder: z.coerce.number().int().default(0) }).parse(Object.fromEntries(fd));
  const data = { group: d.group, question: d.question, answer: d.answer, sortOrder: d.sortOrder, visible: fd.get("visible") === "on" };
  const f = d.id ? await db.faqItem.update({ where: { id: d.id }, data }) : await db.faqItem.create({ data: { ...data, visible: true } });
  await audit(u.id, "faq.save", "FaqItem", f.id); done();
}
export async function deleteFaq(fd: FormData) { const u = await requireStaff("content.edit"); await db.faqItem.delete({ where: { id: String(fd.get("id")) } }); await audit(u.id, "faq.delete", "FaqItem", String(fd.get("id"))); done(); }
export async function saveMenu(fd: FormData) {
  const u = await requireStaff("content.edit");
  const d = z.object({ id: z.string().optional(), location: z.enum(["HEADER", "FOOTER_SHOP", "FOOTER_INFO", "FOOTER_CONTACT"]), label: z.string().trim().min(1), href: z.string().trim().regex(/^(\/|https?:\/\/|mailto:|tel:)/, "Links start with /, https://, mailto: or tel:"), parentId: z.string().optional(), sortOrder: z.coerce.number().int().default(0) }).parse(Object.fromEntries(fd));
  const data = { location: d.location, label: d.label, href: d.href, parentId: d.parentId || null, sortOrder: d.sortOrder };
  const m = d.id ? await db.menuItem.update({ where: { id: d.id }, data }) : await db.menuItem.create({ data });
  await audit(u.id, "menu.save", "MenuItem", m.id); done();
}
export async function deleteMenu(fd: FormData) { const u = await requireStaff("content.edit"); const id = String(fd.get("id")); await db.menuItem.deleteMany({ where: { OR: [{ id }, { parentId: id }] } }); await audit(u.id, "menu.delete", "MenuItem", id); done(); }
