// Abre el detalle de un item Xtream: fuente directa para reproducir + detalle
// completo de TMDB (match por título). Series: temporadas/episodios reales del
// servidor (para reproducir) enriquecidos con TMDB en el drawer.
import { fetchSeriesInfo, fetchVodInfo, xtreamMovieUrl } from "./xtream";
import { enrichFull } from "./tmdbEnrich";
import type { MediaItem, StreamSource } from "./types";

// Detalle usando un tmdbId EXACTO (el que da el servidor Xtream) → sin adivinar.
async function detailsByTmdbId(item: MediaItem, tmdbId: number): Promise<MediaItem> {
  const { getDetails } = await import("./tmdb");
  const full = await getDetails({ ...item, id: tmdbId }).catch(() => null);
  if (!full) return item;
  return { ...full, id: item.id, mediaType: item.mediaType, xtream: item.xtream, tmdbId };
}

type Setters = {
  setSelected: (m: MediaItem) => void;
  setStreams: (s: StreamSource[]) => void;
  setSelectedEpisode: (e: { season: number; episode: number } | null) => void;
  setBusy: (s: string) => void;
};

export async function openXtreamDetails(item: MediaItem, s: Setters): Promise<MediaItem> {
  const x = item.xtream;
  if (!x) return item;

  if (x.kind === "vod") {
    s.setSelected(item);
    s.setStreams([{ source: item.title, addonName: "Xtream", addonId: "iptv_xtream_vod", quality: (x.ext || "").toUpperCase() || "Direct", size: "", url: xtreamMovieUrl(x) }]);
    const vod = await fetchVodInfo(x).catch(() => ({} as { duration?: string; tmdbId?: number }));
    // tmdb_id del servidor = match EXACTO; si no, match por título.
    const rich = vod.tmdbId ? await detailsByTmdbId(item, vod.tmdbId) : await enrichFull(item);
    const out = { ...rich, duration: rich.duration || vod.duration };
    s.setSelected(out);
    return out;
  }

  if (x.kind === "series" && x.seriesId) {
    s.setBusy("Cargando serie");
    const info = await fetchSeriesInfo(x).catch(() => null);
    const rich = info?.tmdbId ? await detailsByTmdbId(item, info.tmdbId) : await enrichFull(item);
    const out = { ...rich, seasons: info?.seasons ?? rich.seasons, xtreamEpisodes: info?.episodes };
    s.setSelected(out);
    s.setBusy("");
    return out;
  }

  s.setSelected(item);
  return item;
}
