import type { PodcastEpisodio, PodcastVinheta, MusicaFaixa } from "./types";

/**
 * PlayableItem — Media Engine genérico (ADR-008 / Fase 1)
 *
 * Toda mídia reproduzível no SpotOnFide converge para este tipo antes de
 * chegar ao PlayerContext. Isso garante que existe apenas UM mecanismo de
 * reprodução (Media Engine), nunca players separados por tipo de mídia.
 *
 * kind: identifica a origem/domínio do item.
 * sourceId: id original na tabela do domínio (ex: podcast_episodios.id).
 *   Necessário porque `id` aqui é uma string composta (`${kind}-${sourceId}`),
 *   usada como dependência estável de efeito no PlayerContext — nunca o
 *   objeto inteiro, que pode ser recriado a cada render.
 */

export type PlayableKind = "episodio" | "vinheta" | "musica" | "radio" | "audiolivro";

export interface PlayableItem {
  id: string;
  kind: PlayableKind;
  sourceId: number;
  titulo: string;
  subtitulo?: string | null;
  capa?: string | null;
  arquivo?: string | null;
  /** Reservado para rádio (Fase 3) — stream ao vivo em vez de arquivo. */
  streamUrl?: string | null;
  duracao?: number | null;
  /** Necessário para o AutoDJ buscar o próximo episódio da série. */
  programaId?: number | null;
  apresentadorId?: number | null;
}

export function episodioToPlayable(
  episodio: PodcastEpisodio,
  extras?: { apresentadorNome?: string | null }
): PlayableItem {
  return {
    id: `episodio-${episodio.id}`,
    kind: "episodio",
    sourceId: episodio.id,
    titulo: episodio.titulo,
    subtitulo: extras?.apresentadorNome ?? null,
    capa: episodio.capa,
    arquivo: episodio.arquivo,
    duracao: episodio.duracao,
    programaId: episodio.programaId ?? null,
    apresentadorId: episodio.apresentadorId ?? null,
  };
}

export function vinhetaToPlayable(vinheta: PodcastVinheta): PlayableItem {
  return {
    id: `vinheta-${vinheta.id}`,
    kind: "vinheta",
    sourceId: vinheta.id,
    titulo: vinheta.titulo,
    subtitulo: "Vinheta",
    capa: null,
    arquivo: vinheta.arquivo,
    duracao: null,
  };
}

export function faixaToPlayable(
  faixa: MusicaFaixa,
  extras?: { artistaNome?: string | null }
): PlayableItem {
  return {
    id: `musica-${faixa.id}`,
    kind: "musica",
    sourceId: faixa.id,
    titulo: faixa.titulo,
    subtitulo: extras?.artistaNome ?? null,
    capa: faixa.capa,
    arquivo: faixa.arquivo,
    duracao: faixa.duracao,
    // Música não usa AutoDJ (programaId) — reservado só para Podcast.
    apresentadorId: null,
  };
}
