import { NextResponse } from "next/server";
import { prisma } from "@/lib/db";
import { analyzeArticle } from "@/lib/seo/analyzer";
import { suggestInternalLinks } from "@/lib/seo/internal-links";
import { requireAdmin } from "@/lib/admin-guard";

/**
 * GET /api/admin/seo/analyze?articleId=… — analyze a saved article
 * POST /api/admin/seo/analyze — analyze unsaved draft from JSON body
 *   { title, slug, metaTitle?, metaDesc?, focusKeyword?, content, coverImage?, coverAlt? }
 */
export const runtime = "nodejs";
export const dynamic = "force-dynamic";

export async function GET(req: Request) {
  await requireAdmin();
  const url = new URL(req.url);
  const id = url.searchParams.get("articleId");
  if (!id) return NextResponse.json({ ok: false, error: "Missing articleId" }, { status: 400 });

  const a = await prisma.article.findUnique({
    where: { id },
    select: {
      id: true,
      title: true,
      metaTitle: true,
      slug: true,
      metaDesc: true,
      focusKeyword: true,
      metaKeywords: true,
      content: true,
      coverImage: true,
      categoryId: true,
    },
  });
  if (!a) return NextResponse.json({ ok: false, error: "Not found" }, { status: 404 });

  const cat = a.categoryId
    ? await prisma.category.findUnique({
        where: { id: a.categoryId },
        select: { slug: true },
      })
    : null;

  const report = analyzeArticle({
    title: a.title,
    metaTitle: a.metaTitle,
    slug: a.slug,
    metaDesc: a.metaDesc,
    focusKeyword: a.focusKeyword,
    metaKeywords: a.metaKeywords,
    content: a.content ?? "",
    coverImage: a.coverImage,
    coverAlt: a.title,
  });

  const suggestions = await suggestInternalLinks({
    draftTitle: a.title,
    draftContent: a.content ?? "",
    draftFocusKeyword: a.focusKeyword,
    draftCategorySlug: cat?.slug ?? null,
    excludeSlug: a.slug,
    limit: 8,
  });

  // Persist score so /admin/seo dashboard reflects fresh data
  await prisma.article
    .update({
      where: { id },
      data: { seoScore: report.score },
    })
    .catch(() => {});

  return NextResponse.json({ ok: true, report, suggestions });
}

export async function POST(req: Request) {
  await requireAdmin();
  let body: Record<string, unknown>;
  try {
    body = (await req.json()) as Record<string, unknown>;
  } catch {
    return NextResponse.json({ ok: false, error: "Invalid JSON" }, { status: 400 });
  }

  const report = analyzeArticle({
    title: String(body.title ?? ""),
    metaTitle: typeof body.metaTitle === "string" ? body.metaTitle : null,
    slug: String(body.slug ?? ""),
    metaDesc: typeof body.metaDesc === "string" ? body.metaDesc : null,
    focusKeyword: typeof body.focusKeyword === "string" ? body.focusKeyword : null,
    metaKeywords: typeof body.metaKeywords === "string" ? body.metaKeywords : null,
    content: String(body.content ?? ""),
    coverImage: typeof body.coverImage === "string" ? body.coverImage : null,
    coverAlt: typeof body.coverAlt === "string" ? body.coverAlt : null,
  });

  const suggestions = await suggestInternalLinks({
    draftTitle: String(body.title ?? ""),
    draftContent: String(body.content ?? ""),
    draftFocusKeyword: typeof body.focusKeyword === "string" ? body.focusKeyword : null,
    draftCategorySlug: typeof body.categorySlug === "string" ? body.categorySlug : null,
    excludeSlug: typeof body.slug === "string" ? body.slug : null,
    limit: 8,
  });

  return NextResponse.json({ ok: true, report, suggestions });
}
