import { requireApiV1Auth } from "@/lib/api-v1/auth";
import { apiJsonOk, toApiErrorResponse } from "@/lib/api-v1/response";
import { listProducts } from "@/lib/api-v1/services/products-service";
import { applyApiRateLimit } from "@/lib/api-v1/rate-limit";
import { ensureEnum, ensureUuid, parsePositiveIntQuery, optionalTrimmedString } from "@/lib/api-v1/validators";

export async function GET(request: Request) {
  try {
    const auth = await requireApiV1Auth(request, "products.read");
    const { searchParams } = new URL(request.url);
    ensureEnum(searchParams.get("status"), ["all", "active", "inactive"] as const, "invalid_status", "Status invalido.", "all");
    const category = optionalTrimmedString(searchParams.get("category"));
    if (category) {
      ensureUuid(category, "invalid_category", "Categoria invalida.");
    }
    parsePositiveIntQuery(searchParams.get("page"), 1, "invalid_page", "Pagina invalida.");
    parsePositiveIntQuery(searchParams.get("per_page"), 20, "invalid_per_page", "Quantidade por pagina invalida.");
    const rateLimit = applyApiRateLimit(
      request,
      {
        namespace: "api-v1:products:get",
        windowMs: 60_000,
        maxPerIp: 120,
        maxPerUser: 120,
      },
      auth.user.id
    );
    const result = await listProducts({ supabase: auth.supabase, user: auth.user, request });
    return apiJsonOk({ items: result.data, pagination: result.pagination }, {
      headers: rateLimit.headers,
    });
  } catch (error) {
    return toApiErrorResponse(error);
  }
}
