import { deduplicateWarpMarkers } from '@suno/studiokit/projectState/warpMarkersRegistry';
import { getWarpBeatsFromSeconds } from '@suno/studiokit/warpUtils';
import { v4 as uuidv4 } from 'uuid';

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

import { pickRandomColor } from '../edit2025/getSections';
import getTimingFromDownbeats, {
  FALLBACK_TIMING_120BPM,
} from '../edit2025/getTimingFromDownbeats';
import { EditTiming } from '../edit2025/types';
import getMarkersFromDownbeats from './getMarkersFromDownbeats';
import { StudioClip } from './types';

export default function createStudioClipSync(
  clip: { id: string; title?: string; metadata?: { duration?: number | null } },
  downbeats: [number, number][] | null,
  expectedDurationSeconds: number = 8 * 60
): { clip: StudioClip; timing: EditTiming } {
  const clipTiming = downbeats
    ? getTimingFromDownbeats(downbeats)
    : FALLBACK_TIMING_120BPM;

  const markers = downbeats ? getMarkersFromDownbeats(downbeats) : { 0: 0 };

  const warp = {
    enabled: true,
    markers: deduplicateWarpMarkers(markers),
    awaitingAnalysis: !downbeats,
    speed: 1,
  };

  const contentStartBeats = getWarpBeatsFromSeconds(warp, 0);

  const contentEndBeats = getWarpBeatsFromSeconds(
    warp,
    clip.metadata?.duration ?? expectedDurationSeconds
  );

  const clipDurationBeats = contentEndBeats - contentStartBeats;

  return {
    clip: {
      streaming: clip.metadata?.duration == null,
      id: uuidv4(),
      clipId: clip.id,
      uploadId: null,
      mute: false,
      name: getClipTitle(clip as Clip) || 'New Clip',
      color: pickRandomColor(clip.id),
      startBeats: contentStartBeats,
      endBeats: contentStartBeats + clipDurationBeats,
      readStartBeats: contentStartBeats,
      fadeInBeats: 0,
      fadeOutBeats: 0,
      transposition: 0,
      amplitude: 1,
      loop: {
        enabled: false,
        startBeats: contentStartBeats,
        endBeats: contentStartBeats + clipDurationBeats,
      },
      warp,
    },
    timing: clipTiming,
  };
}
