"use server";

import { revalidatePath } from "next/cache";
import { prisma } from "@/lib/db";
import { requireAdmin } from "@/lib/admin-guard";

function slugify(s: string): string {
  return s
    .normalize("NFD")
    .replace(/[\u0300-\u036f]/g, "")
    .replace(/đ/g, "d")
    .replace(/Đ/g, "D")
    .toLowerCase()
    .replace(/[^a-z0-9\s-]/g, "")
    .trim()
    .replace(/\s+/g, "-")
    .replace(/-+/g, "-");
}

async function logAudit(
  user: { id: string; name: string; email: string },
  action: string,
  target: string,
  meta: Record<string, unknown>,
) {
  await prisma.auditLog.create({
    data: {
      actorId: user.id,
      actorName: user.name,
      actorEmail: user.email,
      source: "admin",
      action,
      target,
      meta: meta as never,
    },
  });
}

export async function createCategoryAction(formData: FormData) {
  const user = await requireAdmin();
  const name = String(formData.get("name") ?? "").trim();
  if (!name) return { ok: false as const, error: "Thiếu tên." };

  const slugInput = String(formData.get("slug") ?? "").trim();
  const slug = slugInput || slugify(name);
  const description = String(formData.get("description") ?? "").trim() || null;
  const order = Number(formData.get("order") ?? 0);
  const metaTitle = String(formData.get("metaTitle") ?? "").trim() || null;
  const metaDesc = String(formData.get("metaDesc") ?? "").trim() || null;

  const exist = await prisma.category.findUnique({ where: { slug } });
  if (exist) return { ok: false as const, error: `Slug "${slug}" đã tồn tại.` };

  const c = await prisma.category.create({
    data: { name, slug, description, order, metaTitle, metaDesc },
  });
  await logAudit(user, "category.create", c.id, { name, slug });
  revalidatePath("/admin/categories");
  return { ok: true as const, id: c.id };
}

export async function updateCategoryAction(id: string, formData: FormData) {
  const user = await requireAdmin();
  const name = String(formData.get("name") ?? "").trim();
  if (!name) return { ok: false as const, error: "Thiếu tên." };

  const slug = String(formData.get("slug") ?? "").trim();
  if (!slug) return { ok: false as const, error: "Thiếu slug." };
  const description = String(formData.get("description") ?? "").trim() || null;
  const order = Number(formData.get("order") ?? 0);
  const metaTitle = String(formData.get("metaTitle") ?? "").trim() || null;
  const metaDesc = String(formData.get("metaDesc") ?? "").trim() || null;

  // Check slug conflict
  const conflict = await prisma.category.findFirst({
    where: { slug, NOT: { id } },
    select: { id: true },
  });
  if (conflict) return { ok: false as const, error: `Slug "${slug}" trùng với chuyên mục khác.` };

  await prisma.category.update({
    where: { id },
    data: { name, slug, description, order, metaTitle, metaDesc },
  });
  await logAudit(user, "category.update", id, { name, slug });
  revalidatePath("/admin/categories");
  revalidatePath(`/category/${slug}`);
  return { ok: true as const };
}

export async function deleteCategoryAction(id: string) {
  const user = await requireAdmin();
  const c = await prisma.category.findUnique({
    where: { id },
    select: { name: true, slug: true, _count: { select: { articles: true } } },
  });
  if (!c) return { ok: false as const, error: "Không tìm thấy." };
  if (c._count.articles > 0) {
    return {
      ok: false as const,
      error: `Còn ${c._count.articles} bài thuộc chuyên mục này. Chuyển bài sang chuyên mục khác trước.`,
    };
  }
  await prisma.category.delete({ where: { id } });
  await logAudit(user, "category.delete", id, c);
  revalidatePath("/admin/categories");
  return { ok: true as const };
}
