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

export const dynamic = "force-dynamic";

export async function POST(req: NextRequest) {
  const body = await req.json().catch(() => ({}));
  const query: string = (body?.query ?? "").trim();
  if (!query) {
    return NextResponse.json({ error: "query required" }, { status: 400 });
  }

  const genres = await db.genre.findMany({ select: { slug: true, persianName: true, name: true } });
  const genreList = genres.map((g) => g.persianName).join("، ");

  let filters: {
    type: "movie" | "series" | "all";
    genres: string[];
    minRating: number;
    yearFrom: number | null;
    yearTo: number | null;
    dubbed: boolean | null;
    quality: string | null;
    summary: string;
  };

  try {
    filters = await aiJSON(
      `تو موتور جستجوی هوشمند پلتفرم PeepBox هستی. یک درخواست طبیعی فارسی را به فیلترهای ساختاریافته تبدیل کن. ژانرهای مجاز: ${genreList}. فقط ژانرهای دقیق از این لیست را برگردان. خروجی JSON با ساختار: {"type":"movie"|"series"|"all","genres":[...persianNames...],"minRating":number,"yearFrom":number|null,"yearTo":number|null,"dubbed":boolean|null,"quality":string|null,"summary":"یک جمله کوتاه فارسی که توضیح دهد چه چیزی فهمیدی"}`,
      `درخواست کاربر: «${query}»`,
    );
  } catch {
    filters = { type: "all", genres: [], minRating: 0, yearFrom: null, yearTo: null, dubbed: null, quality: null, summary: `نتایج جستجو برای: ${query}` };
  }

  // Map persian genre names to slugs
  const genreSlugs = genres.filter((g) => (filters.genres ?? []).includes(g.persianName)).map((g) => g.slug);

  const baseWhere = (model: "movie" | "series") => {
    const w: any = { status: "published" };
    if (genreSlugs.length) w.genres = { some: { slug: { in: genreSlugs } } };
    if (filters.minRating) w.imdbRating = { gte: filters.minRating };
    if (filters.yearFrom) w.releaseYear = { gte: filters.yearFrom };
    if (filters.yearTo) w.releaseYear = { ...w.releaseYear, lte: filters.yearTo };
    if (filters.quality) w.quality = filters.quality;
    if (filters.dubbed === true) w.isDubbed = true;
    return w;
  };

  const include = { genres: true, country: true };
  const [movies, series] = await Promise.all([
    filters.type === "series" ? Promise.resolve([]) : db.movie.findMany({ where: baseWhere("movie"), include, orderBy: { imdbRating: "desc" }, take: 12 }),
    filters.type === "movie" ? Promise.resolve([]) : db.series.findMany({ where: baseWhere("series"), include, orderBy: { imdbRating: "desc" }, take: 12 }),
  ]);

  return NextResponse.json({
    summary: filters.summary ?? `نتایج جستجوی هوشمند برای: ${query}`,
    filters,
    movies: movies.map(movieCard),
    series: series.map(seriesCard),
    total: movies.length + series.length,
  });
}
