import { NextRequest, NextResponse } from "next/server";
import { db } from "@/lib/db";
import { aiJSON } from "@/lib/ai";
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 baseSlug = searchParams.get("slug");

  // Build a candidate pool: trending + top rated + recent
  const pool = await db.movie.findMany({
    where: { status: "published" },
    orderBy: [{ isTrending: "desc" }, { imdbRating: "desc" }],
    include: MOVIE_INCLUDE,
    take: 24,
  });

  if (pool.length === 0) {
    return NextResponse.json({ headline: "هنوز محتوایی برای پیشنهاد وجود ندارد.", recommendations: [] });
  }

  let baseLine = "";
  if (baseSlug) {
    const base = pool.find((m) => m.slug === baseSlug) ?? (await db.movie.findUnique({ where: { slug: baseSlug }, include: MOVIE_INCLUDE }));
    if (base) {
      baseLine = `کاربر اخیرًا «${base.persianTitle}» (ژانر: ${base.genres.map((g) => g.persianName).join("، ")}، امتیاز ${base.imdbRating}، سال ${base.releaseYear}) را تماشا کرده است. پیشنهادهای مشابه و مرتبط بده.\n\n`;
    }
  }

  const list = pool
    .map((m, i) => `${i + 1}. slug=${m.slug} | ${m.persianTitle} (${m.title}) | ژانر: ${m.genres.map((g) => g.persianName).join("/")} | امتیاز:${m.imdbRating} | سال:${m.releaseYear} | ${m.isDubbed ? "دوبله" : "زیرنویس"} | کیفیت:${m.quality}`)
    .join("\n");

  try {
    const result = await aiJSON<{ picks: { slug: string; reason: string }[]; headline: string }>(
      "تو دستیار پیشنهاد محتوای پلتفرم استریمینگ PeepBox هستی. کاربر فارسی‌زبان است. بر اساس سلیقه کاربر ۶ عنوان مرتبط از لیست زیر انتخاب کن و برای هرکدام یک دلیل کوتاه و جذاب فارسی (حداکثر ۱۵ کلمه) بنویس. فقط از slug های موجود در لیست استفاده کن. پاسخ دقیقاً با این ساختار JSON باشد: {\"headline\": string, \"picks\": [{\"slug\": string, \"reason\": string}]}.",
      `${baseLine}لیست محتواها:\n${list}`,
    );

    const picks = (result.picks ?? []).filter((p) => pool.some((m) => m.slug === p.slug)).slice(0, 6);
    const pickedSlugs = picks.map((p) => p.slug);
    const pickedMovies = pool.filter((m) => pickedSlugs.includes(m.slug));
    const reasonMap = new Map(picks.map((p) => [p.slug, p.reason]));

    return NextResponse.json({
      headline: result.headline ?? "پیشنهاد هوشمند برای شما",
      recommendations: pickedMovies.map((m) => ({ ...movieCard(m), reason: reasonMap.get(m.slug) ?? "" })),
    });
  } catch (e: any) {
    // Fallback: return top 6 by rating without AI
    return NextResponse.json({
      headline: "پیشنهاد ویژه PeepBox",
      recommendations: pool.slice(0, 6).map((m) => ({ ...movieCard(m), reason: `امتیاز بالا ${m.imdbRating} و محبوب میان کاربران` })),
    });
  }
}
