use super::BandConfig;

/// Clipper con modo suave (tanh) y duro (hard clip).
pub struct Clipper;

impl Clipper {
    /// Clipper suave vía tanh. `level` es el nivel en dBFS al cual limitar.
    #[inline]
    pub fn soft(x: f32, level_db: f32) -> f32 {
        let thr = 10f32.powf(level_db / 20.0);
        let x_norm = x / thr;
        // tanh normalizada para que el límite sea ±thr
        x_norm.tanh() * thr
    }

    #[inline]
    pub fn hard(x: f32, level_db: f32) -> f32 {
        let thr = 10f32.powf(level_db / 20.0);
        x.clamp(-thr, thr)
    }

    /// Aplica el clipper a un par de muestras según la config de banda.
    #[inline]
    pub fn process(l: &mut f32, r: &mut f32, cfg: &BandConfig) {
        if !cfg.clip_enable { return; }
        // Usamos clipper suave (tanh) – opcionalmente se podría alternar con hard clip
        *l = Self::soft(*l, cfg.clip_level_db);
        *r = Self::soft(*r, cfg.clip_level_db);
    }
}
