import { SetStateAction } from 'react';

import { StudioProjectState, StudioSelection } from '../types';

export default function updateSelection(
  selection: SetStateAction<StudioSelection>
) {
  return (state: StudioProjectState): StudioProjectState => ({
    ...state,
    selection:
      selection instanceof Function ? selection(state.selection) : selection,
  });
}

export const setBeatRangeSelection =
  (anchorBeats: SetStateAction<number>, focusBeats: SetStateAction<number>) =>
  (state: StudioProjectState): StudioProjectState => ({
    ...state,
    selection: {
      ...state.selection,
      anchorBeats:
        anchorBeats instanceof Function
          ? anchorBeats(state.selection.anchorBeats)
          : anchorBeats,
      focusBeats:
        focusBeats instanceof Function
          ? focusBeats(state.selection.focusBeats)
          : focusBeats,
    },
  });

export const setPointSelection = (beats: SetStateAction<number>) =>
  setBeatRangeSelection(beats, beats);

export const moveSelectionFocus =
  (delta: number) =>
  (state: StudioProjectState): StudioProjectState => ({
    ...state,
    selection: {
      ...state.selection,
      focusBeats: state.selection.focusBeats + delta,
    },
  });
