import { NextRequest, NextResponse } from "next/server"; import { z } from "zod"; import { tmdbFetch, filterAdultMovies } from "@/lib/tmdb/client"; import { DISCOVER_CERT_PARAMS } from "@/lib/tmdb/certification"; import type { TMDBSearchResponse } from "@/types/tmdb"; const popularParamsSchema = z.object({ page: z.coerce.number().int().min(1).max(500).optional().default(1), }); export async function GET(request: NextRequest) { const rawParams = Object.fromEntries(request.nextUrl.searchParams); const parsed = popularParamsSchema.safeParse(rawParams); if (!parsed.success) { return NextResponse.json( { error: "Invalid parameters", details: parsed.error.flatten().fieldErrors }, { status: 400 }, ); } const { page } = parsed.data; try { // Use /discover with sort_by=popularity.desc + cert filter so TMDB // pre-filters server-side; we still post-filter adult flags defensively. const data = await tmdbFetch("/discover/movie", { ...DISCOVER_CERT_PARAMS, sort_by: "popularity.desc", page: String(page), }); return NextResponse.json(filterAdultMovies(data), { headers: { "Cache-Control": "public, s-maxage=300, stale-while-revalidate=60" }, }); } catch (error) { console.error("TMDB popular error:", error); return NextResponse.json({ error: "Failed to fetch popular movies" }, { status: 500 }); } }