import { getSecondsBetween } from '@suno/studiokit/timeMapping';

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

type WaveformSegment = {
  startTimelineBeats: number;
  endTimelineBeats: number;
  startClipBeats: number;
  endClipBeats: number;
};

export const trimSegments = (
  segments: WaveformSegment[],
  minBeat: number = -Infinity,
  maxBeat: number = Infinity,
  // if timing is included, the code within will assume a timeline second === a content second.
  timing?: EditTiming,
  transposeFactor: number = 1
) => {
  const overlappingSegments = segments.filter(
    (segment) =>
      segment.endTimelineBeats > minBeat && segment.startTimelineBeats < maxBeat
  );
  const trimSegment = (segment: WaveformSegment) => {
    if (
      segment.endTimelineBeats <= maxBeat &&
      segment.startTimelineBeats >= minBeat
    ) {
      return segment;
    }
    if (
      segment.endTimelineBeats === segment.startTimelineBeats ||
      segment.startClipBeats === segment.endClipBeats ||
      maxBeat === minBeat
    ) {
      return null;
    }
    const trimmedSegment = { ...segment };
    if (timing) {
      if (segment.endTimelineBeats > maxBeat) {
        trimmedSegment.endClipBeats -=
          getSecondsBetween(maxBeat, trimmedSegment.endTimelineBeats, timing) *
          transposeFactor;
        trimmedSegment.endTimelineBeats = maxBeat;
      }

      if (segment.startTimelineBeats < minBeat) {
        trimmedSegment.startClipBeats +=
          getSecondsBetween(
            trimmedSegment.startTimelineBeats,
            minBeat,
            timing
          ) * transposeFactor;
        trimmedSegment.startTimelineBeats = minBeat;
      }
    } else {
      if (segment.endTimelineBeats > maxBeat) {
        const trimFactor =
          (maxBeat - segment.startTimelineBeats) /
          (segment.endTimelineBeats - segment.startTimelineBeats);
        trimmedSegment.endTimelineBeats = maxBeat;
        trimmedSegment.endClipBeats =
          segment.startClipBeats +
          (segment.endClipBeats - segment.startClipBeats) * trimFactor;
      }

      if (segment.startTimelineBeats < minBeat) {
        const trimFactor =
          (segment.endTimelineBeats - minBeat) /
          (segment.endTimelineBeats - segment.startTimelineBeats);
        trimmedSegment.startTimelineBeats = minBeat;
        trimmedSegment.startClipBeats =
          segment.endClipBeats -
          (segment.endClipBeats - segment.startClipBeats) * trimFactor;
      }
    }

    return trimmedSegment;
  };

  return overlappingSegments
    .map(trimSegment)
    .filter(
      (segment) =>
        !!segment && segment.endTimelineBeats > segment.startTimelineBeats
    ) as WaveformSegment[];
};
