import { NextRequest } from "next/server";
import { apiError, apiOk, requireApiToken } from "@/lib/api-auth";
import { prisma } from "@/lib/db";
import { publishArticle, unpublishArticle } from "@/lib/articles-repo";

async function findByIdOrSlug(idOrSlug: string) {
  return prisma.article.findFirst({
    where: { OR: [{ id: idOrSlug }, { slug: idOrSlug }] },
    select: { id: true, slug: true },
  });
}

export async function publishHandler(req: NextRequest, idOrSlug: string) {
  const ctx = await requireApiToken(req, ["post:publish"]);
  if (ctx instanceof Response) return ctx;
  const a = await findByIdOrSlug(idOrSlug);
  if (!a) return apiError(404, "not_found", "Không tìm thấy.");
  const published = await publishArticle(a.id);
  await ctx.audit({ action: "article.publish", target: a.id, meta: { slug: a.slug } });
  return apiOk({ id: a.id, slug: published.slug, status: published.status });
}

export async function unpublishHandler(req: NextRequest, idOrSlug: string) {
  const ctx = await requireApiToken(req, ["post:publish"]);
  if (ctx instanceof Response) return ctx;
  const a = await findByIdOrSlug(idOrSlug);
  if (!a) return apiError(404, "not_found", "Không tìm thấy.");
  await unpublishArticle(a.id);
  await ctx.audit({ action: "article.unpublish", target: a.id, meta: { slug: a.slug } });
  return apiOk({ id: a.id, status: "draft" });
}
