import { NextRequest, NextResponse } from "next/server";
import { requireAuth, requirePermission, getAdminAuditContext } from "@/lib/admin/auth";
import { db } from "@/lib/admin/db";

export const dynamic = "force-dynamic";

/**
 * GET /api/admin/categories
 * Returns all blog categories from MongoDB.
 */
export async function GET(req: NextRequest) {
  try {
    await requireAuth(req);
    const categories = await db.getCategories();
    return NextResponse.json({ categories });
  } catch (err: any) {
    console.error("[GET /api/admin/categories] Error:", err);
    return NextResponse.json(
      { error: err.message || "Failed to load categories." },
      { status: err.status || 500 }
    );
  }
}

/**
 * POST /api/admin/categories
 * Creates a new category in MongoDB.
 */
export async function POST(req: NextRequest) {
  try {
    const ctx = await requirePermission("posts.edit", req);
    const body = await req.json();

    const name = body.name?.trim();
    if (!name) {
      return NextResponse.json(
        { error: "Category name is required." },
        { status: 400 }
      );
    }

    let slug = body.slug?.trim()?.toLowerCase();
    if (!slug) {
      slug = name
        .toLowerCase()
        .replace(/[^a-z0-9]+/g, "-")
        .replace(/(^-|-$)+/g, "");
    } else {
      slug = slug
        .toLowerCase()
        .replace(/[^a-z0-9]+/g, "-")
        .replace(/(^-|-$)+/g, "");
    }

    if (!slug) {
      return NextResponse.json(
        { error: "A valid URL slug could not be generated from the category name." },
        { status: 400 }
      );
    }

    const auditCtx = await getAdminAuditContext(req);
    const category = await db.createCategory({
      name,
      slug,
      description: body.description?.trim() || "",
    });

    await db.logContentEvent({
      actorId: ctx.user.id,
      actorName: ctx.user.name,
      actorEmail: ctx.user.email,
      actorRole: ctx.user.role,
      location: auditCtx.location || null,
      postId: null,
      postTitle: null,
      postSlug: null,
      action: "CATEGORY_CREATED",
      details: {
        categoryId: category.id,
        categoryName: category.name,
        categorySlug: category.slug,
        note: `Created category "${category.name}" (${category.slug})`,
      },
    });

    return NextResponse.json({ category }, { status: 201 });
  } catch (err: any) {
    console.error("[POST /api/admin/categories] Error:", err);
    return NextResponse.json(
      { error: err.message || "Failed to create category." },
      { status: err.status || 400 }
    );
  }
}
