import { requireApiV1Auth } from "@/lib/api-v1/auth";
import { apiJsonOk, toApiErrorResponse } from "@/lib/api-v1/response";
import { createCategory, listCategories } from "@/lib/api-v1/services/categories-service";
import { applyApiRateLimit } from "@/lib/api-v1/rate-limit";
import { parseJsonObject } from "@/lib/api-v1/validators";

export async function GET(request: Request) {
  try {
    const auth = await requireApiV1Auth(request, "categories.read");
    const rateLimit = applyApiRateLimit(
      request,
      {
        namespace: "api-v1:categories:get",
        windowMs: 60_000,
        maxPerIp: 120,
        maxPerUser: 120,
      },
      auth.user.id
    );
    const result = await listCategories({ supabase: auth.supabase, user: auth.user });
    return apiJsonOk({ items: result.categories }, { headers: rateLimit.headers });
  } catch (error) {
    return toApiErrorResponse(error);
  }
}

export async function POST(request: Request) {
  try {
    const auth = await requireApiV1Auth(request, "categories.write");
    const rateLimit = applyApiRateLimit(
      request,
      {
        namespace: "api-v1:categories:post",
        windowMs: 60_000,
        maxPerIp: 60,
        maxPerUser: 60,
      },
      auth.user.id
    );
    const body = await parseJsonObject(request);
    const result = await createCategory({ supabase: auth.supabase, user: auth.user, body });
    return apiJsonOk(result.category, {
      headers: rateLimit.headers,
    });
  } catch (error) {
    return toApiErrorResponse(error);
  }
}
