import { VideoPresets, type TrackPublishDefaults } from 'livekit-client'
import type { PublishQualityCap } from '@/api/conferences'

/**
 * Потолок качества публикации → `TrackPublishDefaults` для `RoomOptions.publishDefaults`
 * (см. `RoomPage.tsx`, `roomOptions`).
 *
 * Ограничивается только `videoEncoding` (битрейт/framerate верхнего слоя
 * симулкаста) и набор дополнительных слоёв `videoSimulcastLayers` — НЕ
 * фактическое разрешение захвата камеры (`videoCaptureDefaults`, трогать
 * его не входит в задачу). WebRTC сам подстраивает реальное разрешение
 * кодирования под урезанный битрейт (`degradationPreference`), поэтому
 * проверять эффект нужно по фактическому битрейту исходящего видео, а не по
 * заявленному разрешению потока.
 *
 * Слои каждого потолка — все пресеты LiveKit НИЖЕ и РАВНО потолку (без
 * дефолтного «h180, h360», который иначе подставился бы сам при пустом
 * `videoSimulcastLayers` и мог бы превысить потолок 180p).
 */
const PUBLISH_DEFAULTS_BY_CAP: Record<Exclude<PublishQualityCap, 'off'>, TrackPublishDefaults> = {
  '180p': { videoEncoding: VideoPresets.h180.encoding, videoSimulcastLayers: [] },
  '360p': { videoEncoding: VideoPresets.h360.encoding, videoSimulcastLayers: [VideoPresets.h180] },
  '720p': {
    videoEncoding: VideoPresets.h720.encoding,
    videoSimulcastLayers: [VideoPresets.h180, VideoPresets.h360],
  },
}

/**
 * `off` — `undefined`: `publishDefaults` не задаётся вовсе, поведение
 * библиотеки не отличается от состояния до появления настройки (см.
 * критерий готовности «дефолты сохраняют текущее поведение»).
 */
export function buildPublishDefaults(cap: PublishQualityCap): TrackPublishDefaults | undefined {
  return cap === 'off' ? undefined : PUBLISH_DEFAULTS_BY_CAP[cap]
}
