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 describeClip from './describeClipTiming';
import { StudioClip } from './types';

export default function createKnownTimingStudioClipSync(
  clip: Clip,
  downbeats: [number, number][],
  knownDurationSeconds: number = clip.metadata.duration ?? 8 * 60
): StudioClip {
  const { contentStartSeconds, contentEndSeconds } = describeClip(
    clip,
    clip.metadata.duration ?? knownDurationSeconds
  );
  if (contentEndSeconds == null) {
    throw new Error('Content end seconds is null');
  }

  const firstDownbeatIndex = downbeats
    ? Math.max(
        downbeats.findIndex((b) => b[1] === 1),
        0
      )
    : 0;

  const markers: Record<number, number> = {};
  if (downbeats) {
    downbeats.forEach(([second], index) => {
      markers[second] = index - firstDownbeatIndex;
    });
  } else {
    markers[0] = 0;
  }

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

  const contentEndBeats = getWarpBeatsFromSeconds(warp, contentEndSeconds);
  const contentStartBeats = getWarpBeatsFromSeconds(warp, contentStartSeconds);

  const audioStartBeats = getWarpBeatsFromSeconds(warp, 0);
  const audioEndBeats = getWarpBeatsFromSeconds(
    warp,
    clip.metadata.duration ?? knownDurationSeconds
  );

  const clipDurationBeats = contentEndBeats - contentStartBeats;

  return {
    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: 0,
    endBeats: clipDurationBeats,
    readStartBeats: contentStartBeats,
    fadeInBeats: 0,
    fadeOutBeats: 0,
    transposition: 0,
    amplitude: 1,
    loop: {
      enabled: false,

      // TODO: switch back to this when DSP module no longer makes extra-loop content inaudible
      // startBeats: contentStartBeats,
      // endBeats: contentStartBeats + clipDurationBeats,

      startBeats: audioStartBeats,
      endBeats: audioEndBeats,
    },
    warp,
  };
}
