import { db } from "./db";
import { gradientFor } from "./poster";

// ===================== Serialization (flatten Prisma objects for API) =====================

export interface ContentCard {
  id: string;
  slug: string;
  type: "movie" | "series";
  title: string;
  persianTitle: string;
  poster: string | null;
  backdrop: string | null;
  gradient: [string, string];
  imdbRating: number;
  releaseYear: number;
  quality: string;
  isDubbed: boolean;
  hasSubtitle: boolean;
  isPremium: boolean;
  isNew: boolean;
  isTrending: boolean;
  duration?: number;
  totalSeasons?: number;
  views: number;
  genres: { id: string; name: string; persianName: string; slug: string }[];
  country?: { name: string; persianName: string } | null;
  ageRating: string;
  shortDesc?: string | null;
  progress?: number; // for continue watching
}

export function movieCard(m: any): ContentCard {
  return {
    id: m.id,
    slug: m.slug,
    type: "movie",
    title: m.title,
    persianTitle: m.persianTitle,
    poster: m.poster ?? null,
    backdrop: m.backdrop ?? null,
    gradient: m.poster ? ["#000", "#000"] : gradientFor(m.slug + m.title),
    imdbRating: m.imdbRating,
    releaseYear: m.releaseYear,
    quality: m.quality,
    isDubbed: m.isDubbed,
    hasSubtitle: m.hasSubtitle,
    isPremium: m.isPremium,
    isNew: m.isNew,
    isTrending: m.isTrending,
    duration: m.duration,
    views: m.views,
    genres: (m.genres ?? []).map((g: any) => ({ id: g.id, name: g.name, persianName: g.persianName, slug: g.slug })),
    country: m.country ? { name: m.country.name, persianName: m.country.persianName } : null,
    ageRating: m.ageRating,
    shortDesc: m.shortDesc ?? null,
  };
}

export function seriesCard(s: any): ContentCard {
  return {
    id: s.id,
    slug: s.slug,
    type: "series",
    title: s.title,
    persianTitle: s.persianTitle,
    poster: s.poster ?? null,
    backdrop: s.backdrop ?? null,
    gradient: s.poster ? ["#000", "#000"] : gradientFor(s.slug + s.title),
    imdbRating: s.imdbRating,
    releaseYear: s.releaseYear,
    quality: s.quality,
    isDubbed: s.isDubbed,
    hasSubtitle: s.hasSubtitle,
    isPremium: s.isPremium,
    isNew: s.isNew,
    isTrending: s.isTrending,
    totalSeasons: s.totalSeasons,
    views: s.views,
    genres: (s.genres ?? []).map((g: any) => ({ id: g.id, name: g.name, persianName: g.persianName, slug: g.slug })),
    country: s.country ? { name: s.country.name, persianName: s.country.persianName } : null,
    ageRating: s.ageRating,
    shortDesc: s.shortDesc ?? null,
  };
}

// ===================== Query helpers =====================

export const MOVIE_INCLUDE = {
  genres: true,
  country: true,
};

export const MOVIE_DETAIL_INCLUDE = {
  genres: true,
  country: true,
  cast: { include: { actor: true }, orderBy: { order: "asc" } },
  directors: { include: { director: true } },
  sources: true,
};

export const SERIES_DETAIL_INCLUDE = {
  genres: true,
  country: true,
  cast: { include: { actor: true }, orderBy: { order: "asc" } },
  directors: { include: { director: true } },
  seasons: { include: { episodes: { orderBy: { number: "asc" } } }, orderBy: { number: "asc" } },
};

// ===================== Home data aggregator =====================

export interface HomeRow {
  id: string;
  title: string;
  slug: string;
  type: "movie" | "series" | "mixed";
  items: ContentCard[];
}

export async function getHomeData() {
  const [featuredMovies, trending, latestMovies, latestSeries, topRated, dubbed, subtitled, fourK, premium, genres] = await Promise.all([
    db.movie.findMany({
      where: { isFeatured: true, status: "published" },
      orderBy: { featuredOrder: "asc" },
      include: MOVIE_INCLUDE,
      take: 6,
    }),
    db.movie.findMany({
      where: { isTrending: true, status: "published" },
      orderBy: { views: "desc" },
      include: MOVIE_INCLUDE,
      take: 12,
    }),
    db.movie.findMany({
      where: { status: "published" },
      orderBy: { createdAt: "desc" },
      include: MOVIE_INCLUDE,
      take: 12,
    }),
    db.series.findMany({
      where: { status: "published" },
      orderBy: { createdAt: "desc" },
      include: { genres: true, country: true },
      take: 12,
    }),
    db.movie.findMany({
      where: { status: "published" },
      orderBy: { imdbRating: "desc" },
      include: MOVIE_INCLUDE,
      take: 12,
    }),
    db.movie.findMany({
      where: { isDubbed: true, status: "published" },
      orderBy: { views: "desc" },
      include: MOVIE_INCLUDE,
      take: 12,
    }),
    db.movie.findMany({
      where: { hasSubtitle: true, status: "published" },
      orderBy: { views: "desc" },
      include: MOVIE_INCLUDE,
      take: 12,
    }),
    db.movie.findMany({
      where: { quality: "2160p", status: "published" },
      orderBy: { views: "desc" },
      include: MOVIE_INCLUDE,
      take: 12,
    }),
    db.movie.findMany({
      where: { isPremium: true, status: "published" },
      orderBy: { views: "desc" },
      include: MOVIE_INCLUDE,
      take: 12,
    }),
    db.genre.findMany({ orderBy: { name: "asc" } }),
  ]);

  const heroes = featuredMovies.map((m) => movieCard(m));

  // Continue watching (mock: top viewed movies with fake progress)
  const continueWatching = await db.movie.findMany({
    where: { status: "published" },
    orderBy: { views: "desc" },
    include: MOVIE_INCLUDE,
    take: 8,
  });

  const rows: HomeRow[] = [
    { id: "trending", title: "داغ‌ترین‌ها", slug: "trending", type: "movie", items: trending.map(movieCard) },
    { id: "latest-movies", title: "جدیدترین فیلم‌ها", slug: "latest-movies", type: "movie", items: latestMovies.map(movieCard) },
    { id: "latest-series", title: "جدیدترین سریال‌ها", slug: "latest-series", type: "series", items: latestSeries.map(seriesCard) },
    { id: "top-rated", title: "بالاترین امتیاز IMDb", slug: "top-rated", type: "movie", items: topRated.map(movieCard) },
    { id: "dubbed", title: "فیلم‌های دوبله فارسی", slug: "dubbed", type: "movie", items: dubbed.map(movieCard) },
    { id: "subtitled", title: "زیرنویس فارسی", slug: "subtitled", type: "movie", items: subtitled.map(movieCard) },
    { id: "4k", title: "محتوای 4K", slug: "4k", type: "movie", items: fourK.map(movieCard) },
    { id: "premium", title: "ویژه اشتراک Premium", slug: "premium", type: "movie", items: premium.map(movieCard) },
  ];

  return {
    heroes,
    rows,
    continueWatching: continueWatching.map((m, i) => ({
      ...movieCard(m),
      progress: [12, 35, 48, 67, 22, 81, 5, 44][i] ?? 30,
    })),
    genres: genres.map((g) => ({ id: g.id, name: g.name, persianName: g.persianName, slug: g.slug })),
  };
}
