"use server";

import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";
import { prisma } from "@/lib/prisma";
import { slugify } from "@/lib/slug";
import { requirePermission } from "@/lib/permissions";

export async function createCategory(formData: FormData) {
  await requirePermission("categories", "add");
  const name = String(formData.get("name") ?? "").trim();
  if (!name) redirect("/iv-manage-84x2/categories?error=Name+is+required");

  const slug = slugify(name);
  const existing = await prisma.category.findUnique({ where: { slug } });
  if (existing) redirect("/iv-manage-84x2/categories?error=A+category+with+that+name+already+exists");

  await prisma.category.create({ data: { name, slug } });
  revalidatePath("/iv-manage-84x2/categories");
  revalidatePath("/shop");
  redirect("/iv-manage-84x2/categories?success=Category+added.");
}

export async function updateCategoryDiscount(id: string, formData: FormData) {
  await requirePermission("categories", "edit");
  const raw = String(formData.get("discountPercent") ?? "").trim();
  const discountPercent = raw === "" ? null : Math.min(90, Math.max(0, Math.round(Number(raw))));
  await prisma.category.update({ where: { id }, data: { discountPercent } });
  revalidatePath("/iv-manage-84x2/discounts/categories");
  revalidatePath("/shop");
  revalidatePath("/");
  redirect("/iv-manage-84x2/discounts/categories?success=Category+discount+updated.");
}

export async function updateCategoryName(id: string, formData: FormData) {
  await requirePermission("categories", "edit");
  const name = String(formData.get("name") ?? "").trim();
  if (!name) redirect("/iv-manage-84x2/categories?error=Name+is+required");

  const slug = slugify(name);
  const existing = await prisma.category.findUnique({ where: { slug } });
  if (existing && existing.id !== id) {
    redirect("/iv-manage-84x2/categories?error=A+category+with+that+name+already+exists");
  }

  await prisma.category.update({ where: { id }, data: { name, slug } });
  revalidatePath("/iv-manage-84x2/categories");
  revalidatePath("/", "layout");
  revalidatePath("/shop");
  redirect("/iv-manage-84x2/categories?success=Category+updated.");
}

export async function updateCategorySortOrder(id: string, formData: FormData) {
  await requirePermission("categories", "edit");
  const sortOrder = Math.round(Number(formData.get("sortOrder") ?? 0)) || 0;
  await prisma.category.update({ where: { id }, data: { sortOrder } });
  revalidatePath("/iv-manage-84x2/categories");
  revalidatePath("/", "layout");
  redirect("/iv-manage-84x2/categories?success=Sort+order+updated.");
}

export async function updateCategoryParent(id: string, formData: FormData) {
  await requirePermission("categories", "edit");
  const parentId = String(formData.get("parentId") ?? "").trim() || null;
  if (parentId === id) redirect("/iv-manage-84x2/categories?error=A+category+can%27t+be+its+own+parent");
  await prisma.category.update({ where: { id }, data: { parentId } });
  revalidatePath("/iv-manage-84x2/categories");
  revalidatePath("/", "layout");
  redirect("/iv-manage-84x2/categories?success=Category+updated.");
}

export async function deleteCategory(id: string) {
  await requirePermission("categories", "delete");
  const productCount = await prisma.product.count({ where: { categoryId: id } });
  if (productCount > 0) {
    redirect("/iv-manage-84x2/categories?error=Move+or+delete+its+products+first");
  }
  await prisma.category.delete({ where: { id } });
  revalidatePath("/iv-manage-84x2/categories");
  redirect("/iv-manage-84x2/categories?success=Category+deleted.");
}
