import { TimeSelection } from '../../types';
import copyArraySection from './copyArraySection';
import makeAudioBuffer from './makeAudioBuffer';

export default (
  audioBuffer: AudioBuffer,
  [
    selectionStartSamples,
    selectionEndSamples,
  ]: TimeSelection,
  fn: (sample: number, index: number, outputChannelData: Float32Array) => number,
  relativeIndices?: boolean
) => {
  const newAudioBuffer = makeAudioBuffer({
    length: audioBuffer.length,
    sampleRate: audioBuffer.sampleRate,
    numberOfChannels: audioBuffer.numberOfChannels
  });

  for(let c = 0; c < audioBuffer.numberOfChannels; c ++) {
    const originalChannelData = audioBuffer.getChannelData(c);
    const outputChannelData = newAudioBuffer.getChannelData(c);
    copyArraySection(originalChannelData, outputChannelData, audioBuffer.length, 0, 0);
    for (let s = selectionStartSamples; s <= selectionEndSamples; s ++) {
      outputChannelData[s] = fn(
        outputChannelData[s],
        relativeIndices ? s - selectionStartSamples : s,
        outputChannelData,
      );
    }
  }

  return newAudioBuffer;
}
