import { StudioContextType } from './StudioContext';
import getClipRelativePoint from './getClipRelativePoint';
import { inFlightDragKeys } from './hooks/useInFlightDrags';
import { getDerivedTiming } from './selectors';
import { StudioClip } from './types';

export default function applyInFlightClipOffsets(
  studioClip: StudioClip,
  studioContext: {
    state: StudioContextType['state'];
    inFlightDrags: Pick<StudioContextType['inFlightDrags'], 'get'>;
  }
): StudioClip {
  const inFlightDelta = studioContext.inFlightDrags.get(
    inFlightDragKeys.clip(studioClip.id)
  );
  const inFlightStartDelta = studioContext.inFlightDrags.get(
    inFlightDragKeys.clipEdge(studioClip.id, 'start')
  );
  const inFlightEndDelta = studioContext.inFlightDrags.get(
    inFlightDragKeys.clipEdge(studioClip.id, 'end')
  );

  if (inFlightStartDelta && !inFlightEndDelta) {
    const readStartBeats = getClipRelativePoint(
      getDerivedTiming(studioContext.state),
      studioClip,
      studioClip.startBeats + inFlightStartDelta,
      true
    )[0];
    return {
      ...studioClip,
      startBeats: Math.min(
        studioClip.startBeats + inFlightStartDelta,
        studioClip.endBeats + inFlightDelta - 0.01
      ),
      readStartBeats,
    };
  } else if (!inFlightStartDelta && inFlightEndDelta) {
    return {
      ...studioClip,
      endBeats: Math.max(
        studioClip.endBeats + inFlightEndDelta,
        studioClip.startBeats + inFlightDelta + 0.01
      ),
    };
  } else {
    return {
      ...studioClip,
      startBeats: Math.min(
        studioClip.startBeats + (inFlightStartDelta || inFlightDelta),
        studioClip.endBeats + (inFlightEndDelta || inFlightDelta) - 0.01
      ),
      endBeats: Math.max(
        studioClip.endBeats + (inFlightEndDelta || inFlightDelta),
        studioClip.startBeats + (inFlightStartDelta || inFlightDelta) + 0.01
      ),
      readStartBeats: getClipRelativePoint(
        getDerivedTiming(studioContext.state),
        studioClip,
        studioClip.startBeats + inFlightStartDelta,
        true
      )[0],
    };
  }
}
