import { applyPanning, getDefaultPanning } from '../balance';
import Effect from '../Effect';
import NumberSetting from '../Settings/NumberSetting';

type ChannelStripSettings = {
  gain: NumberSetting;
  balance: NumberSetting;
}

export default class ChannelStrip extends Effect<ChannelStripSettings> {
  protected outputSamples = new Float32Array(2);

  getDefaultSettings() {
    return {
      gain: new NumberSetting(1),
      balance: new NumberSetting(0),
    }
  }

  updateOutputSamples(inputSamples: Float32Array) {
    const gain = this.settings.gain.value;
    const balance = this.settings.balance.value;
    this.outputSamples[0] = 0;
    this.outputSamples[1] = 0;
    const channelCount = inputSamples.length;
    for (let channelIndex = 0; channelIndex < channelCount; channelIndex ++) {
      const defaultPan = getDefaultPanning(channelIndex, channelCount);
      const adjustedPan = Math.min(1, Math.max(-1, defaultPan + (2 * balance)));
      this.outputSamples[0] += gain * applyPanning(inputSamples[channelIndex], adjustedPan, true);
      this.outputSamples[1] += gain * applyPanning(inputSamples[channelIndex], adjustedPan, false);
    }
  }
}
