import type { AudioProcessor, ProcessorCategory } from "./AudioProcessor";

export class Normalize implements AudioProcessor {
  getName(): string {
    return "Normalize";
  }

  getDescription(): string {
    return "Normalizes audio to maximum amplitude without clipping";
  }

  getCategory(): ProcessorCategory {
    return 'Amplitude';
  }

  async process(
    leftChannel: Float32Array,
    rightChannel: Float32Array
  ): Promise<[Float32Array, Float32Array]> {
    let maxAmplitude = 0;

    for (let i = 0; i < leftChannel.length; i++) {
      maxAmplitude = Math.max(maxAmplitude, Math.abs(leftChannel[i]));
      maxAmplitude = Math.max(maxAmplitude, Math.abs(rightChannel[i]));
    }

    if (maxAmplitude === 0) {
      return [leftChannel, rightChannel];
    }

    const gain = 1.0 / maxAmplitude;

    const newLeft = new Float32Array(leftChannel.length);
    const newRight = new Float32Array(rightChannel.length);

    for (let i = 0; i < leftChannel.length; i++) {
      newLeft[i] = leftChannel[i] * gain;
      newRight[i] = rightChannel[i] * gain;
    }

    return [newLeft, newRight];
  }
}
