import { getSelectedTracks } from './selectionTools';
import { ProjectState, Selection } from '../../types';
import concatBuffers from '../audioFunctions/concatBuffers';

const updateBuffersBySelection = (
  state: ProjectState,
  selection: Selection,
  selectionStatusToTarget: boolean,
  fn: (buffer: AudioBuffer) => AudioBuffer
) => {
  const newTracks = [...state.tracks];
  const selectedTracks = getSelectedTracks(selection);
  newTracks.forEach((track, trackIndex) => {
    if (selectionStatusToTarget === selectedTracks.includes(trackIndex)) {
      newTracks[trackIndex] = {
        ...newTracks[trackIndex],
        audioBuffers: [fn(concatBuffers(track.audioBuffers))]
      };
    }
  });
  return {
    ...state,
    tracks: newTracks
  };
};

export const updateSelectedBuffers = (
  state: ProjectState,
  selection: Selection,
  fn: (buffer: AudioBuffer) => AudioBuffer
) => updateBuffersBySelection(state, selection, true, fn);

export const updateUnselectedBuffers = (
  state: ProjectState,
  selection: Selection,
  fn: (buffer: AudioBuffer) => AudioBuffer
) => updateBuffersBySelection(state, selection, false, fn);
