import { getEffectiveMarkers } from '@suno/studiokit/warpUtils';

import { StudioClip } from './types';

export const getBeatsFromClipContentSeconds = (
  clip: StudioClip,
  clipContentSeconds: number
) => {
  const markers = getEffectiveMarkers(clip.warp);
  const sortedMarkers = Object.entries(markers)
    .map(([seconds, beats]) => [Number(seconds), beats])
    .sort((a, b) => a[0] - b[0]);

  const markerBefore = sortedMarkers.findLast(
    ([seconds]) => seconds < clipContentSeconds
  );
  const markerBeforeMarkerBefore =
    markerBefore &&
    sortedMarkers.findLast(([seconds]) => seconds < markerBefore[0]);

  const markerAfter = sortedMarkers.find(
    ([seconds]) => seconds > clipContentSeconds
  );
  const markerAfterMarkerAfter =
    markerAfter && sortedMarkers.find(([seconds]) => seconds > markerAfter[0]);

  if (markerBefore !== undefined && markerAfter !== undefined) {
    const [markerBeforeSeconds, markerBeforeBeats] = markerBefore;
    const [markerAfterSeconds, markerAfterBeats] = markerAfter;

    const t =
      (clipContentSeconds - markerBeforeSeconds) /
      (markerAfterSeconds - markerBeforeSeconds);

    return markerBeforeBeats + t * (markerAfterBeats - markerBeforeBeats);
  } else if (
    markerBefore !== undefined &&
    markerBeforeMarkerBefore !== undefined
  ) {
    const [markerBeforeSeconds, markerBeforeBeats] = markerBefore;
    const [markerBeforeMarkerBeforeSeconds, markerBeforeMarkerBeforeBeats] =
      markerBeforeMarkerBefore;
    const markerBeforeBPS =
      (markerBeforeBeats - markerBeforeMarkerBeforeBeats) /
      (markerBeforeSeconds - markerBeforeMarkerBeforeSeconds);
    return (
      markerBeforeBeats +
      markerBeforeBPS * (clipContentSeconds - markerBeforeSeconds)
    );
  } else if (
    markerAfter !== undefined &&
    markerAfterMarkerAfter !== undefined
  ) {
    const [markerAfterSeconds, markerAfterBeats] = markerAfter;
    const [markerAfterMarkerAfterSeconds, markerAfterMarkerAfterBeats] =
      markerAfterMarkerAfter;
    const markerAfterBPS =
      (markerAfterBeats - markerAfterMarkerAfterBeats) /
      (markerAfterSeconds - markerAfterMarkerAfterSeconds);
    return (
      markerAfterBeats +
      markerAfterBPS * (clipContentSeconds - markerAfterSeconds)
    );
  }

  console.log(markers);
  console.log(clipContentSeconds);
  throw new Error('No markers found');
};
