using System;

namespace FluidSim.Core
{
    public class SoundProcessor
    {
        private readonly float dt;
        private readonly float scaleFactor;   // 1 / (4π r)
        private float flowLP, prevMassFlowOut, smoothDMdt;
        private readonly float lpAlpha, alpha;

        public float Gain = 1f;

        public SoundProcessor(int sampleRate, float listenerDistance = 1f)
        {
            dt = 1f / sampleRate;
            scaleFactor = 1f / (4f * MathF.PI * listenerDistance);
            float tau = 0.02f;
            alpha = MathF.Exp(-dt / tau);
            float tauLP = 0.005f;
            lpAlpha = MathF.Exp(-dt / tauLP);
        }

        public float Process(float massFlowOut)
        {
            flowLP = lpAlpha * flowLP + (1f - lpAlpha) * massFlowOut;
            float rawDerivative = (flowLP - prevMassFlowOut) / dt;
            prevMassFlowOut = flowLP;
            smoothDMdt = alpha * smoothDMdt + (1f - alpha) * rawDerivative;
            float pressure = smoothDMdt * scaleFactor * Gain;
            return MathF.Tanh(pressure);
        }
    }
}