import { addSecondsToBeats } from '@suno/studiokit/timeMapping';
import {
  getWarpBeatsFromSeconds,
  getWarpEnabledAndPopulated,
  getWarpSecondsFromBeats,
} from '@suno/studiokit/warpUtils';

import { EditTiming } from '../edit2025/types';
import { StudioClip } from './types';

const getAbsolutePoint = (
  timing: EditTiming,
  clip: StudioClip,
  relativeBeats: number,
  forceFirstLoop: boolean = false
) => {
  if (getWarpEnabledAndPopulated(clip.warp)) {
    const adjustedForReadStart = relativeBeats - clip.readStartBeats;
    let adjustedForTimelineOffset = clip.startBeats + adjustedForReadStart;
    if (!forceFirstLoop && relativeBeats < clip.readStartBeats) {
      adjustedForTimelineOffset += clip.loop.endBeats - clip.loop.startBeats;
    }

    return adjustedForTimelineOffset;
  } else {
    const readStartSeconds = getWarpSecondsFromBeats(
      clip.warp,
      clip.readStartBeats
    );
    const relativeSeconds = getWarpSecondsFromBeats(clip.warp, relativeBeats);
    const delta = relativeSeconds - readStartSeconds;
    return addSecondsToBeats(delta, clip.startBeats, timing);
  }
};

export const getAbsoluteBeatsFromSeconds = (
  timing: EditTiming,
  clip: StudioClip,
  relativeSeconds: number,
  forceFirstLoop: boolean = false
) => {
  return getAbsolutePoint(
    timing,
    clip,
    getWarpBeatsFromSeconds(clip.warp, relativeSeconds),
    forceFirstLoop
  );
};

export default getAbsolutePoint;
