"use server";

import { revalidatePath } from "next/cache";
import { redirect } from "next/navigation";
import { prisma } from "@/lib/db";
import { requireAdmin } from "@/lib/admin-guard";
import { createPage, updatePage, deletePage, type PageInput } from "@/lib/pages-repo";

type FormResult = { ok: true; id: string } | { ok: false; error: string };

function buildInput(formData: FormData, authorId: string): PageInput {
  const status = String(formData.get("status") ?? "draft") as PageInput["status"];
  return {
    title: String(formData.get("title") ?? "").trim(),
    slug: String(formData.get("slug") ?? "").trim() || null,
    content: String(formData.get("content") ?? ""),
    status,
    metaTitle: String(formData.get("metaTitle") ?? "").trim() || null,
    metaDesc: String(formData.get("metaDesc") ?? "").trim() || null,
    metaKeywords: String(formData.get("metaKeywords") ?? "").trim() || null,
    ogImage: String(formData.get("ogImage") ?? "").trim() || null,
    canonicalUrl: String(formData.get("canonicalUrl") ?? "").trim() || null,
    noIndex: formData.get("noIndex") === "on",
    showInFooter: formData.get("showInFooter") === "on",
    footerOrder: Number(formData.get("footerOrder") ?? 0) || 0,
    authorId,
  };
}

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 createPageAction(formData: FormData): Promise<FormResult> {
  const user = await requireAdmin();
  const input = buildInput(formData, user.id);
  if (!input.title) return { ok: false, error: "Thiếu tiêu đề." };
  if (!input.content) return { ok: false, error: "Thiếu nội dung." };

  const created = await createPage(input);
  await logAudit(user, "page.create", created.id, {
    title: created.title,
    slug: created.slug,
    status: created.status,
  });
  revalidatePath("/admin/pages");
  redirect(`/admin/pages/${created.id}`);
}

export async function updatePageAction(id: string, formData: FormData): Promise<FormResult> {
  const user = await requireAdmin();
  const input = buildInput(formData, user.id);
  if (!input.title) return { ok: false, error: "Thiếu tiêu đề." };
  if (!input.content) return { ok: false, error: "Thiếu nội dung." };

  const updated = await updatePage(id, input);
  await logAudit(user, "page.update", id, {
    title: updated.title,
    slug: updated.slug,
    status: updated.status,
  });
  revalidatePath("/admin/pages");
  revalidatePath(`/admin/pages/${id}`);
  revalidatePath(`/${updated.slug}`);
  return { ok: true, id: updated.id };
}

export async function deletePageAction(
  id: string,
): Promise<{ ok: boolean; error?: string }> {
  const user = await requireAdmin();
  const page = await prisma.page.findUnique({
    where: { id },
    select: { slug: true, title: true, isSystem: true },
  });
  if (!page) return { ok: false, error: "Không tìm thấy trang." };
  if (page.isSystem) return { ok: false, error: "Không thể xoá trang hệ thống." };
  await deletePage(id);
  await logAudit(user, "page.delete", id, { slug: page.slug, title: page.title });
  revalidatePath("/admin/pages");
  redirect("/admin/pages");
}
