import { NextRequest, NextResponse } from "next/server";
import { getArchivePage } from "@/lib/starter-data";

function parseParamList(value: string | null) {
  if (!value?.trim()) {
    return [];
  }

  return value
    .split(",")
    .map((item) => item.trim())
    .filter(Boolean);
}

export async function GET(request: NextRequest) {
  try {
    const page = Math.max(
      1,
      Number.parseInt(request.nextUrl.searchParams.get("page") || "1", 10) || 1,
    );
    const perPage = Math.max(
      1,
      Number.parseInt(request.nextUrl.searchParams.get("per_page") || "15", 10) || 15,
    );
    const query = request.nextUrl.searchParams.get("q") || "";
    const categories = parseParamList(request.nextUrl.searchParams.get("category"));
    const brands = parseParamList(request.nextUrl.searchParams.get("brand"));
    const sortParam = request.nextUrl.searchParams.get("sort");
    const sort = sortParam === "price-desc" ? "price-desc" : "price-asc";
    const minPriceParam = request.nextUrl.searchParams.get("min_price");
    const maxPriceParam = request.nextUrl.searchParams.get("max_price");
    const minPrice =
      minPriceParam && Number.isFinite(Number.parseFloat(minPriceParam))
        ? Math.max(0, Number.parseFloat(minPriceParam))
        : undefined;
    const maxPrice =
      maxPriceParam && Number.isFinite(Number.parseFloat(maxPriceParam))
        ? Math.max(0, Number.parseFloat(maxPriceParam))
        : undefined;
    const onSaleParam = request.nextUrl.searchParams.get("on_sale");
    const onSale = onSaleParam === "1" || onSaleParam === "true";
    const archive = await getArchivePage({
      page,
      perPage,
      query,
      categories,
      brands,
      sort,
      minPrice,
      maxPrice,
      onSale,
    });

    return NextResponse.json(archive, {
      headers: {
        "Cache-Control": "private, no-store, max-age=0",
      },
    });
  } catch (error) {
    return NextResponse.json(
      {
        message: error instanceof Error ? error.message : "Archive request failed.",
      },
      { status: 500 },
    );
  }
}
