import type { TmdbMovieDetails, TmdbRecommendationResponse, TmdbSearchResponse, TmdbSeasonDetails, TmdbTvDetails, TmdbWatchProviderResponse, } from "./types"; const BASE_URL = "https://api.themoviedb.org/3"; function getApiKey() { const key = process.env.TMDB_API_KEY; if (!key) throw new Error("TMDB_API_KEY is not set"); return key; } async function tmdbFetch( path: string, params?: Record, ): Promise { const url = new URL(`${BASE_URL}${path}`); if (params) { for (const [k, v] of Object.entries(params)) { url.searchParams.set(k, v); } } const res = await fetch(url.toString(), { headers: { Authorization: `Bearer ${getApiKey()}`, Accept: "application/json", }, }); if (!res.ok) { throw new Error(`TMDB API error: ${res.status} ${res.statusText}`); } return res.json() as Promise; } export async function searchMulti(query: string, page = 1) { return tmdbFetch("/search/multi", { query, page: String(page), include_adult: "false", }); } export async function searchMovies(query: string, page = 1) { return tmdbFetch("/search/movie", { query, page: String(page), }); } export async function searchTv(query: string, page = 1) { return tmdbFetch("/search/tv", { query, page: String(page), }); } export async function getMovieDetails(tmdbId: number) { return tmdbFetch(`/movie/${tmdbId}`); } export async function getTvDetails(tmdbId: number) { return tmdbFetch(`/tv/${tmdbId}`); } export async function getTvSeasonDetails(tmdbId: number, seasonNumber: number) { return tmdbFetch(`/tv/${tmdbId}/season/${seasonNumber}`); } export async function getWatchProviders(tmdbId: number, type: "movie" | "tv") { return tmdbFetch( `/${type}/${tmdbId}/watch/providers`, ); } export async function getRecommendations(tmdbId: number, type: "movie" | "tv") { return tmdbFetch( `/${type}/${tmdbId}/recommendations`, ); } export async function getSimilar(tmdbId: number, type: "movie" | "tv") { return tmdbFetch(`/${type}/${tmdbId}/similar`); } export function tmdbImageUrl(path: string | null, size = "w500") { if (!path) return null; return `https://image.tmdb.org/t/p/${size}${path}`; }