import { RefObject } from 'react';

import { MAX_PX_PER_BEAT } from '@/components/studio/constants';

export default function applyAutoScrollLimiting(
  scrollXRef: RefObject<number>,
  pxPerBeatRef: RefObject<number>,
  timelineWrapperRect: DOMRect,
  songStartBeats: number,
  songEndBeats: number,
  zoomAboutSelectionOrCenter: (ratio: number) => void,
  padding: number = 30
) {
  // auto scroll limiting
  let paddedTimelineStartBeats =
    (scrollXRef.current + padding) / pxPerBeatRef.current;
  let paddedTimelineEndBeats =
    (scrollXRef.current + timelineWrapperRect.width - padding) /
    pxPerBeatRef.current;

  const paddedSpan = paddedTimelineEndBeats - paddedTimelineStartBeats;
  const songSpan = songEndBeats - songStartBeats;
  if (paddedSpan > songSpan) {
    zoomAboutSelectionOrCenter(paddedSpan / songSpan);
    paddedTimelineStartBeats =
      (scrollXRef.current + padding) / pxPerBeatRef.current;
    paddedTimelineEndBeats =
      (scrollXRef.current + timelineWrapperRect.width - padding) /
      pxPerBeatRef.current;
  }

  if (pxPerBeatRef.current > MAX_PX_PER_BEAT) {
    // e.g. when a 1024th note is 1000px wide
    zoomAboutSelectionOrCenter(MAX_PX_PER_BEAT / pxPerBeatRef.current);
  }

  if (paddedTimelineStartBeats < songStartBeats) {
    scrollXRef.current +=
      (songStartBeats - paddedTimelineStartBeats) * pxPerBeatRef.current;
  }
  if (paddedTimelineEndBeats > songEndBeats) {
    scrollXRef.current -=
      (paddedTimelineEndBeats - songEndBeats) * pxPerBeatRef.current;
  }
}
