import { apiRequest } from '@/shared/api/client' import type { CreatedIdResponse, EnrichShowsResult, MetadataCandidate, MissingEpisodesReport, MissingSeasonsReport, ShowAudience, ShowDto, ShowKind, ShowSummaryDto, ShowUsageDto, } from '@/shared/api/types' export function listShows(genreId?: string) { const query = genreId ? `?${new URLSearchParams({ genreId }).toString()}` : '' return apiRequest(`/admin/shows${query}`) } export function getShow(id: string) { return apiRequest(`/admin/shows/${id}`) } export function createShow(body: { name: string kind: ShowKind description?: string originalName?: string audience?: ShowAudience | null }) { return apiRequest('/admin/shows', { method: 'POST', body }) } /** `null` — снять проставленный рейтинг. */ export function setShowAudience(id: string, audience: ShowAudience | null) { return apiRequest(`/admin/shows/${id}/audience`, { method: 'PUT', body: { audience } }) } /** Полностью заменяет набор жанров шоу; основной — primaryGenreId (иначе первый в списке). */ export function setShowGenres(id: string, genreIds: string[], primaryGenreId: string | null) { return apiRequest(`/admin/shows/${id}/genres`, { method: 'PUT', body: { genreIds, primaryGenreId }, }) } export function renameShow(id: string, name: string) { return apiRequest(`/admin/shows/${id}/name`, { method: 'PUT', body: { name } }) } export function setShowOriginalName(id: string, originalName: string | null) { return apiRequest(`/admin/shows/${id}/original-name`, { method: 'PUT', body: { originalName }, }) } /** Массовая разметка отмеченных шоу: жанры и рейтинг применяются независимо. */ export function bulkTagShows(body: { showIds: string[] genreIds?: string[] replaceGenres?: boolean audience?: ShowAudience | null setAudience?: boolean }) { return apiRequest<{ updated: number }>('/admin/shows/bulk/tag', { method: 'POST', body }) } /** Массовое обогащение: найти метаданные по названию и применить тем, у кого нет привязки. */ export function bulkEnrichShows(showIds: string[], provider: string) { return apiRequest('/admin/shows/bulk/enrich', { method: 'POST', body: { showIds, provider }, }) } /** Где шоу задействовано: группы, коллекции, каналы. */ export function getShowUsage(id: string) { return apiRequest(`/admin/shows/${id}/usage`) } /** * `withMedia` — снести заодно файлы шоу: иначе они переживут его осиротевшими. * `withSchedule` — вырезать шоу из будущего эфира вместо отказа. */ export function deleteShow(id: string, withMedia = false, withSchedule = false) { const query = new URLSearchParams() if (withMedia) query.set('withMedia', 'true') if (withSchedule) query.set('withSchedule', 'true') const suffix = query.size > 0 ? `?${query.toString()}` : '' return apiRequest(`/admin/shows/${id}${suffix}`, { method: 'DELETE' }) } export function addEpisode(showId: string, mediaAssetId: string) { return apiRequest(`/admin/shows/${showId}/episodes`, { method: 'POST', body: { mediaAssetId }, }) } export function removeEpisode(showId: string, episodeId: string) { return apiRequest(`/admin/shows/${showId}/episodes/${episodeId}`, { method: 'DELETE' }) } // ── Метаданные ──────────────────────────────────────────────────────────── export function getMetadataProviders() { return apiRequest('/admin/metadata/providers') } /** `kind` определяет, среди чего искать: у TMDb сериалы и фильмы — разные пространства id. */ export function searchMetadata(provider: string, query: string, kind: ShowKind) { const q = new URLSearchParams({ provider, query, kind }) return apiRequest(`/admin/metadata/search?${q.toString()}`) } export function applyMetadata(showId: string, provider: string, externalId: string) { return apiRequest(`/admin/metadata/shows/${showId}/apply`, { method: 'POST', body: { provider, externalId }, }) } export function updateMetadata( showId: string, body: { description: string | null; year: number | null }, ) { return apiRequest(`/admin/metadata/shows/${showId}`, { method: 'PUT', body }) } export function clearMetadata(showId: string) { return apiRequest(`/admin/metadata/shows/${showId}`, { method: 'DELETE' }) } /** Привязать/снять постер шоу по ссылке на изображение из реестра (null — отвязать). */ export function setShowPoster(showId: string, imageId: string | null) { return apiRequest(`/admin/metadata/shows/${showId}/poster-image`, { method: 'PUT', body: { imageId }, }) } /** Довыгрузить метаданные серий из привязанного источника. Возвращает число обновлённых. */ export function refreshEpisodesMetadata(showId: string) { return apiRequest(`/admin/metadata/shows/${showId}/refresh-episodes`, { method: 'POST' }) } /** Отчёт: каких серий не хватает в загруженных сезонах (по данным источника). */ export function findMissingEpisodes(showId: string) { return apiRequest(`/admin/metadata/shows/${showId}/missing-episodes`) } /** Отчёт: каких сезонов нет в библиотеке вовсе (по данным источника). */ export function findMissingSeasons(showId: string) { return apiRequest(`/admin/metadata/shows/${showId}/missing-seasons`) }