import { NextRequest, NextResponse } from "next/server";
import { db } from "@/lib/db";
import { movieCard, MOVIE_INCLUDE } from "@/lib/content";

export const dynamic = "force-dynamic";

export async function GET(req: NextRequest) {
  const { searchParams } = new URL(req.url);
  const page = Math.max(1, Number(searchParams.get("page") ?? "1"));
  const limit = Math.min(60, Number(searchParams.get("limit") ?? "24"));
  const genre = searchParams.get("genre");
  const year = searchParams.get("year");
  const quality = searchParams.get("quality");
  const country = searchParams.get("country");
  const dubbed = searchParams.get("dubbed");
  const sort = searchParams.get("sort") ?? "latest";
  const q = searchParams.get("q");

  const where: any = { status: "published" };
  if (genre) where.genres = { some: { slug: genre } };
  if (year) where.releaseYear = Number(year);
  if (quality) where.quality = quality;
  if (country) where.country = { slug: country };
  if (dubbed === "1") where.isDubbed = true;
  if (q) {
    where.OR = [
      { title: { contains: q } },
      { persianTitle: { contains: q } },
      { originalTitle: { contains: q } },
    ];
  }

  const orderBy: any =
    sort === "rating" ? { imdbRating: "desc" }
    : sort === "views" ? { views: "desc" }
    : sort === "year" ? { releaseYear: "desc" }
    : { createdAt: "desc" };

  const [items, total, genres, years, countries] = await Promise.all([
    db.movie.findMany({ where, include: MOVIE_INCLUDE, orderBy, skip: (page - 1) * limit, take: limit }),
    db.movie.count({ where }),
    db.genre.findMany({ orderBy: { name: "asc" } }),
    db.movie.findMany({ where: { status: "published" }, select: { releaseYear: true }, distinct: ["releaseYear"], orderBy: { releaseYear: "desc" } }),
    db.country.findMany({ orderBy: { name: "asc" } }),
  ]);

  return NextResponse.json({
    items: items.map(movieCard),
    total,
    page,
    limit,
    totalPages: Math.ceil(total / limit),
    filters: {
      genres: genres.map((g) => ({ slug: g.slug, name: g.name, persianName: g.persianName })),
      years: years.map((y) => y.releaseYear),
      qualities: ["480p", "720p", "1080p", "2160p"],
      countries: countries.map((c) => ({ slug: c.slug, name: c.name, persianName: c.persianName })),
    },
  });
}
