import { apiRequest } from '@/shared/api/client'
import type {
  CollectionDto,
  CollectionSuggestionDto,
  CollectionSummaryDto,
  CreatedIdResponse,
} from '@/shared/api/types'

export function listCollections() {
  return apiRequest<CollectionSummaryDto[]>('/admin/collections')
}

export function getCollection(id: string) {
  return apiRequest<CollectionDto>(`/admin/collections/${id}`)
}

export function createCollection(body: { name: string; description?: string }) {
  return apiRequest<CreatedIdResponse>('/admin/collections', { method: 'POST', body })
}

export function updateCollection(id: string, body: { name: string; description: string | null }) {
  return apiRequest<void>(`/admin/collections/${id}`, { method: 'PUT', body })
}

export function deleteCollection(id: string) {
  return apiRequest<void>(`/admin/collections/${id}`, { method: 'DELETE' })
}

/** Массовое добавление во франшизу: существующая коллекция либо новая по имени. */
export function addShowsToCollection(body: {
  showIds: string[]
  collectionId?: string
  newCollectionName?: string
}) {
  return apiRequest<{ collectionId: string; name: string; added: number }>(
    '/admin/collections/bulk/shows',
    { method: 'POST', body },
  )
}

/** Какие франшизы имеет смысл собрать из уже загруженных полнометражек. */
/**
 * Проставляет постеры по частям коллекций. Без списка — всем, у кого постера ещё нет: после
 * массового импорта фильмов франшиз сразу десятки. Возвращает, скольким постер нашёлся.
 */
export function fillCollectionPosters(collectionIds?: string[]) {
  return apiRequest<number>('/admin/collections/bulk/posters', {
    method: 'POST',
    body: { collectionIds: collectionIds ?? null },
  })
}

export function suggestCollections() {
  return apiRequest<CollectionSuggestionDto[]>('/admin/collections/suggestions')
}

export function createCollectionFromSuggestion(key: string) {
  return apiRequest<CreatedIdResponse>('/admin/collections/suggestions', {
    method: 'POST',
    body: { key },
  })
}

/** Дополняет уже собранную франшизу по тому же ключу предложения; возвращает, сколько добавлено. */
export function addShowsFromSuggestion(key: string) {
  return apiRequest<number>('/admin/collections/suggestions/add', {
    method: 'POST',
    body: { key },
  })
}

export function addCollectionShow(id: string, showId: string) {
  return apiRequest<void>(`/admin/collections/${id}/shows`, { method: 'POST', body: { showId } })
}

export function removeCollectionShow(id: string, showId: string) {
  return apiRequest<void>(`/admin/collections/${id}/shows/${showId}`, { method: 'DELETE' })
}

/** Порядок частей: не упомянутые остаются после перечисленных. */
export function reorderCollection(id: string, showIdsInOrder: string[]) {
  return apiRequest<void>(`/admin/collections/${id}/order`, {
    method: 'PUT',
    body: { showIdsInOrder },
  })
}

/** Привязать/снять постер коллекции (null — отвязать). */
export function setCollectionPoster(id: string, imageId: string | null) {
  return apiRequest<void>(`/admin/collections/${id}/poster-image`, {
    method: 'PUT',
    body: { imageId },
  })
}
