import { type PersistedQueueItem, type PersistedQueueStatus } from '@shared/ipc'
import { type DownloadItem, type DownloadStatus } from './downloadTypes'

/**
 * Pure mapping between the live `DownloadItem` and the durable `PersistedQueueItem`
 * main stores across restarts (M4). Kept free of any store/zustand import so it can
 * be unit-tested in isolation (mirrors queueStats / formatters). Only stable fields
 * persist — runtime-only progress/speed/eta/sizeLabel/finishing are dropped and
 * re-derived on restore.
 */

// Statuses worth surviving a quit. 'completed'/'canceled' are transient results
// (completions already live in history) and are never persisted.
export const PERSISTED_STATUSES: readonly DownloadStatus[] = [
  'queued',
  'downloading',
  'paused',
  'saved',
  'error'
]

export function toPersisted(i: DownloadItem): PersistedQueueItem {
  return {
    id: i.id,
    url: i.url,
    title: i.title,
    channel: i.channel,
    durationLabel: i.durationLabel,
    thumbnail: i.thumbnail,
    kind: i.kind,
    quality: i.quality,
    status: i.status as PersistedQueueStatus,
    filePath: i.filePath,
    error: i.error,
    formatId: i.formatId,
    formatHasAudio: i.formatHasAudio,
    options: i.options,
    extraArgs: i.extraArgs,
    trim: i.trim,
    scheduledFor: i.scheduledFor,
    incognito: i.incognito,
    probedMeta: i.probedMeta,
    collection: i.collection,
    mediaItemId: i.mediaItemId
  }
}

export function fromPersisted(p: PersistedQueueItem): DownloadItem {
  return {
    ...p,
    // A download in flight when we quit lost its process; re-queue it (yt-dlp
    // continues the .part on relaunch). Progress restarts from 0.
    status: p.status === 'downloading' ? 'queued' : p.status,
    progress: 0
  }
}

/** The persistable subset of the live queue, in durable form. */
export function persistableItems(items: DownloadItem[]): PersistedQueueItem[] {
  return items
    .filter((i) => (PERSISTED_STATUSES as readonly string[]).includes(i.status))
    .map(toPersisted)
}
