import { v4 as uuidv4 } from 'uuid';

import { Clip } from '@/state/clipStore';
import { getClipTitle } from '@/utils/clip';

import { pickRandomColor } from '../edit2025/getSections';
import describeClip from './describeClipTiming';
import { StudioClip } from './types';

// note: consumer should set endBeats
export default function createUnknownTimingStudioClipSync(
  clip: Clip,
  expectedBps?: number,
  includeContextWindow: boolean = false
): StudioClip {
  const { contentStartSeconds, contentDurationSeconds } = describeClip(clip);

  const finalContentStartSeconds = includeContextWindow
    ? 0
    : contentStartSeconds;

  const finalContentDurationSeconds = includeContextWindow
    ? (clip.metadata.duration ?? null)
    : (contentDurationSeconds ?? clip.metadata.duration);

  let expectedDurationBeats = 8 * 60 * 2; // 8 minutes at 120bpm (2bps);

  const bps = clip.metadata.avg_bpm ? clip.metadata.avg_bpm / 60 : expectedBps;

  if (finalContentDurationSeconds && bps) {
    expectedDurationBeats = finalContentDurationSeconds * bps;
  }

  // clip starts at default 1bps playback.
  // as we stream downbeats, loop and readStart should be updated
  const warp = {
    enabled: true,
    markers: { 0: 0 },
    awaitingAnalysis: true,
    speed: 1,
  };

  return {
    streaming: clip.status !== 'complete',
    id: uuidv4(),
    clipId: clip.id,
    uploadId: null,
    mute: false,
    name: getClipTitle(clip as Clip) || 'New Clip',
    color: pickRandomColor(clip.id),
    startBeats: 0,
    endBeats: expectedDurationBeats,
    readStartBeats: finalContentStartSeconds,
    fadeInBeats: 0,
    fadeOutBeats: 0,
    transposition: 0,
    amplitude: 1,
    loop: {
      enabled: false,
      startBeats: 0,
      endBeats: 999,
    },
    warp,
  };
}
