import { apiRequest, getAccessToken, HttpError } from '@/shared/api/client'
import type {
  BumperBackground,
  BumperFont,
  BumperLineDto,
  BumperTemplateDto,
  BumperTrigger,
  CreatedIdResponse,
} from '@/shared/api/types'

/** Блоки заставок общие для всех каналов — свой раздел, а не подраздел канала. */
export function listBumperTemplates() {
  return apiRequest<BumperTemplateDto[]>('/admin/bumpers')
}

export function createBumperTemplate(name: string) {
  return apiRequest<CreatedIdResponse>('/admin/bumpers', { method: 'POST', body: { name } })
}

export type BumperStyleBody = {
  name: string
  font: BumperFont
  backgroundColor: string
  backgroundColor2: string
  accentColor: string
  textColor: string
}

export function updateBumperTemplate(templateId: string, body: BumperStyleBody) {
  return apiRequest<void>(`/admin/bumpers/${templateId}`, { method: 'PUT', body })
}

export function deleteBumperTemplate(templateId: string) {
  return apiRequest<void>(`/admin/bumpers/${templateId}`, { method: 'DELETE' })
}

export type BumperVariantBody = {
  name: string
  trigger: BumperTrigger
  background: BumperBackground
  weight: number
  lines: BumperLineDto[]
}

export function addBumperVariant(templateId: string, name: string) {
  return apiRequest<CreatedIdResponse>(`/admin/bumpers/${templateId}/variants`, {
    method: 'POST',
    body: { name },
  })
}

export function updateBumperVariant(
  templateId: string,
  variantId: string,
  body: BumperVariantBody,
) {
  return apiRequest<void>(`/admin/bumpers/${templateId}/variants/${variantId}`, {
    method: 'PUT',
    body,
  })
}

export function removeBumperVariant(templateId: string, variantId: string) {
  return apiRequest<void>(`/admin/bumpers/${templateId}/variants/${variantId}`, {
    method: 'DELETE',
  })
}

export function setBumperBackground(templateId: string, imageId: string) {
  return apiRequest<void>(`/admin/bumpers/${templateId}/background`, {
    method: 'PUT',
    body: { imageId },
  })
}

export function clearBumperBackground(templateId: string) {
  return apiRequest<void>(`/admin/bumpers/${templateId}/background`, { method: 'DELETE' })
}

export function clearBumperAudio(templateId: string) {
  return apiRequest<void>(`/admin/bumpers/${templateId}/audio`, { method: 'DELETE' })
}

/**
 * Синхронно рендерит примеры всех подблоков. Канал нужен только для образцов подстановки: блок
 * общий, но посмотреть его надо глазами конкретного канала — иначе `{channel}` не на что заменить.
 */
export function renderBumperPreviews(templateId: string, channelId: string | null) {
  const query = channelId ? `?channelId=${channelId}` : ''
  return apiRequest<void>(`/admin/bumpers/${templateId}/preview${query}`, { method: 'POST' })
}

export function bumperPreviewPlaylistUrl(templateId: string, variantId: string) {
  return `/api/admin/bumpers/${templateId}/preview/${variantId}/index.m3u8`
}

/** Загрузка звука блока: тело — файл, имя — в query (как в uploadMedia). */
export function uploadBumperAudio(templateId: string, file: File): Promise<void> {
  return new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest()
    const query = new URLSearchParams({ fileName: file.name })
    xhr.open('PUT', `/api/admin/bumpers/${templateId}/audio?${query.toString()}`)
    const token = getAccessToken()
    if (token) xhr.setRequestHeader('Authorization', `Bearer ${token}`)
    xhr.onload = () => {
      if (xhr.status >= 200 && xhr.status < 300) {
        resolve()
      } else {
        let detail = `HTTP ${xhr.status}`
        try {
          const problem = JSON.parse(xhr.responseText) as { detail?: string; title?: string }
          detail = problem.detail ?? problem.title ?? detail
        } catch {
          /* пусто */
        }
        reject(new HttpError({ detail }, xhr.status))
      }
    }
    xhr.onerror = () => reject(new HttpError({ title: 'Network error' }, 0))
    xhr.send(file)
  })
}
