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

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

type WaveformSegment = {
  startTimelineBeats: number;
  endTimelineBeats: number;
  startAudioSeconds: number;
  endAudioSeconds: number;
  color?: string;
};

export const trimSegments = (
  segments: WaveformSegment[],
  minBeat: number = -Infinity,
  maxBeat: number = Infinity,
  timing: EditTiming
) => {
  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.startAudioSeconds === segment.endAudioSeconds ||
      maxBeat === minBeat
    ) {
      return null;
    }
    const trimmedSegment = { ...segment };
    if (segment.endTimelineBeats > maxBeat) {
      trimmedSegment.endAudioSeconds -= getSecondsBetween(
        maxBeat,
        trimmedSegment.endTimelineBeats,
        timing
      );
      trimmedSegment.endTimelineBeats = maxBeat;
    }

    if (segment.startTimelineBeats < minBeat) {
      trimmedSegment.startAudioSeconds += getSecondsBetween(
        trimmedSegment.startTimelineBeats,
        minBeat,
        timing
      );
      trimmedSegment.startTimelineBeats = minBeat;
    }

    return trimmedSegment;
  };

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