import {
  addSecondsToBeats,
  getBeatsFromZero,
  getSecondsFromZero,
} from '@suno/studiokit/timeMapping';

import { EditTiming } from '@/components/edit2025/types';

import { ExactBeatRange, ExactSecondsRange, TimeRangeSpec } from '../types';

export default function resolveTimeRange(
  timing: EditTiming,
  timeRange: TimeRangeSpec
): {
  beats: ExactBeatRange;
  seconds: ExactSecondsRange;
} {
  if (timeRange.type === 'exact-beat-range') {
    return {
      beats: {
        type: 'exact-beat-range',
        startBeats: timeRange.startBeats,
        endBeats: timeRange.endBeats,
      },
      seconds: {
        type: 'exact-seconds-range',
        startSeconds:
          getSecondsFromZero(timeRange.startBeats, timing) -
          timing.firstBeatSeconds,
        endSeconds:
          getSecondsFromZero(timeRange.endBeats, timing) -
          timing.firstBeatSeconds,
      },
    };
  } else if (timeRange.type === 'exact-seconds-range') {
    return {
      beats: {
        type: 'exact-beat-range',
        startBeats: getBeatsFromZero(timeRange.startSeconds, timing),
        endBeats: getBeatsFromZero(timeRange.endSeconds, timing),
      },
      seconds: {
        type: 'exact-seconds-range',
        startSeconds: timeRange.startSeconds,
        endSeconds: timeRange.endSeconds,
      },
    };
  } else if (timeRange.type === 'centered-seconds-window') {
    const startBeats = addSecondsToBeats(
      -timeRange.durationSeconds / 2,
      timeRange.centerBeats,
      timing
    );
    const endBeats = addSecondsToBeats(
      timeRange.durationSeconds,
      startBeats,
      timing
    );
    return resolveTimeRange(timing, {
      type: 'exact-beat-range',
      startBeats,
      endBeats,
    });
  } else {
    throw new Error(`Invalid context window type "${(timeRange as any).type}"`);
  }
}
