import { z } from "zod";
import { NextRequest } from "next/server";
import { apiError, apiOk, requireApiToken } from "@/lib/api-auth";
import { prisma } from "@/lib/db";
import { slugify } from "@/lib/slug-vi";

export const runtime = "nodejs";

// GET /api/v1/categories
export async function GET(req: NextRequest) {
  const ctx = await requireApiToken(req, ["category:read"]);
  if (ctx instanceof Response) return ctx;
  const cats = await prisma.category.findMany({
    orderBy: { order: "asc" },
    select: {
      id: true,
      slug: true,
      name: true,
      description: true,
      order: true,
      _count: { select: { articles: true } },
    },
  });
  return apiOk({
    items: cats.map((c) => ({
      id: c.id,
      slug: c.slug,
      name: c.name,
      description: c.description,
      order: c.order,
      articleCount: c._count.articles,
    })),
  });
}

// POST /api/v1/categories — admin-only via token
const CreateBody = z.object({
  slug: z.string().min(1).max(60).optional(),
  name: z.string().min(1).max(80),
  description: z.string().max(300).optional(),
  order: z.number().int().min(0).max(999).optional(),
  metaTitle: z.string().max(120).optional(),
  metaDesc: z.string().max(300).optional(),
});

export async function POST(req: NextRequest) {
  const ctx = await requireApiToken(req, ["category:write"]);
  if (ctx instanceof Response) return ctx;
  let body: unknown;
  try {
    body = await req.json();
  } catch {
    return apiError(400, "bad_json", "Body không phải JSON.");
  }
  const parsed = CreateBody.safeParse(body);
  if (!parsed.success)
    return apiError(400, "bad_body", "Body không hợp lệ.", parsed.error.flatten());
  const data = parsed.data;
  const slug = slugify(data.slug ?? data.name);
  if (!slug) return apiError(400, "bad_slug", "Slug rỗng sau khi normalize.");
  const exists = await prisma.category.findUnique({ where: { slug } });
  if (exists) return apiError(409, "slug_taken", `Đã có chuyên mục slug=${slug}`);
  const cat = await prisma.category.create({
    data: {
      slug,
      name: data.name,
      description: data.description ?? null,
      order: data.order ?? 0,
      metaTitle: data.metaTitle ?? null,
      metaDesc: data.metaDesc ?? null,
    },
  });
  await ctx.audit({
    action: "category.create",
    target: cat.id,
    meta: { slug: cat.slug, name: cat.name },
  });
  return apiOk(cat, 201);
}
