/*
 *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */
#include "api/audio/echo_canceller3_config.h"

#include <algorithm>

#include "rtc_base/logging.h"
#include "rtc_base/numerics/safe_minmax.h"

namespace webrtc {
namespace {
bool Limit(float* value, float min, float max) {
  float clamped = rtc::SafeClamp(*value, min, max);
  bool res = *value == clamped;
  *value = clamped;
  return res;
}

bool Limit(size_t* value, size_t min, size_t max) {
  size_t clamped = rtc::SafeClamp(*value, min, max);
  bool res = *value == clamped;
  *value = clamped;
  return res;
}

bool Limit(int* value, int min, int max) {
  int clamped = rtc::SafeClamp(*value, min, max);
  bool res = *value == clamped;
  *value = clamped;
  return res;
}
}  // namespace

EchoCanceller3Config::EchoCanceller3Config() = default;
EchoCanceller3Config::EchoCanceller3Config(const EchoCanceller3Config& e) =
    default;
EchoCanceller3Config::Delay::Delay() = default;
EchoCanceller3Config::Delay::Delay(const EchoCanceller3Config::Delay& e) =
    default;

EchoCanceller3Config::Mask::Mask() = default;
EchoCanceller3Config::Mask::Mask(const EchoCanceller3Config::Mask& m) = default;

EchoCanceller3Config::EchoModel::EchoModel() = default;
EchoCanceller3Config::EchoModel::EchoModel(
    const EchoCanceller3Config::EchoModel& e) = default;

EchoCanceller3Config::Suppressor::Suppressor() = default;
EchoCanceller3Config::Suppressor::Suppressor(
    const EchoCanceller3Config::Suppressor& e) = default;

EchoCanceller3Config::Suppressor::MaskingThresholds::MaskingThresholds(
    float enr_transparent,
    float enr_suppress,
    float emr_transparent)
    : enr_transparent(enr_transparent),
      enr_suppress(enr_suppress),
      emr_transparent(emr_transparent) {}
EchoCanceller3Config::Suppressor::Suppressor::MaskingThresholds::
    MaskingThresholds(
        const EchoCanceller3Config::Suppressor::MaskingThresholds& e) = default;

EchoCanceller3Config::Suppressor::Tuning::Tuning(MaskingThresholds mask_lf,
                                                 MaskingThresholds mask_hf,
                                                 float max_inc_factor,
                                                 float max_dec_factor_lf)
    : mask_lf(mask_lf),
      mask_hf(mask_hf),
      max_inc_factor(max_inc_factor),
      max_dec_factor_lf(max_dec_factor_lf) {}
EchoCanceller3Config::Suppressor::Tuning::Tuning(
    const EchoCanceller3Config::Suppressor::Tuning& e) = default;

bool EchoCanceller3Config::Validate(EchoCanceller3Config* config) {
  RTC_DCHECK(config);
  EchoCanceller3Config* c = config;
  bool res = true;

  if (c->delay.down_sampling_factor != 4 &&
      c->delay.down_sampling_factor != 8) {
    c->delay.down_sampling_factor = 4;
    res = false;
  }

  if (c->delay.num_filters == 0) {
    c->delay.num_filters = 1;
    res = false;
  }
  if (c->delay.api_call_jitter_blocks == 0) {
    c->delay.api_call_jitter_blocks = 1;
    res = false;
  }

  if (c->delay.api_call_jitter_blocks == 0) {
    c->delay.api_call_jitter_blocks = 1;
    res = false;
  }
  if (c->delay.delay_headroom_blocks <= 1 &&
      c->delay.hysteresis_limit_1_blocks == 1) {
    c->delay.hysteresis_limit_1_blocks = 0;
    res = false;
  }
  res = res && Limit(&c->delay.delay_estimate_smoothing, 0.f, 1.f);
  res = res && Limit(&c->delay.delay_candidate_detection_threshold, 0.f, 1.f);
  res = res && Limit(&c->delay.delay_selection_thresholds.initial, 1, 250);
  res = res && Limit(&c->delay.delay_selection_thresholds.converged, 1, 250);

  res = res && Limit(&c->filter.main.length_blocks, 1, 50);
  res = res && Limit(&c->filter.main.leakage_converged, 0.f, 1000.f);
  res = res && Limit(&c->filter.main.leakage_diverged, 0.f, 1000.f);
  res = res && Limit(&c->filter.main.error_floor, 0.f, 1000.f);
  res = res && Limit(&c->filter.main.noise_gate, 0.f, 100000000.f);

  res = res && Limit(&c->filter.main_initial.length_blocks, 1, 50);
  res = res && Limit(&c->filter.main_initial.leakage_converged, 0.f, 1000.f);
  res = res && Limit(&c->filter.main_initial.leakage_diverged, 0.f, 1000.f);
  res = res && Limit(&c->filter.main_initial.error_floor, 0.f, 1000.f);
  res = res && Limit(&c->filter.main_initial.noise_gate, 0.f, 100000000.f);

  if (c->filter.main.length_blocks < c->filter.main_initial.length_blocks) {
    c->filter.main_initial.length_blocks = c->filter.main.length_blocks;
    res = false;
  }

  res = res && Limit(&c->filter.shadow.length_blocks, 1, 50);
  res = res && Limit(&c->filter.shadow.rate, 0.f, 1.f);
  res = res && Limit(&c->filter.shadow.noise_gate, 0.f, 100000000.f);

  res = res && Limit(&c->filter.shadow_initial.length_blocks, 1, 50);
  res = res && Limit(&c->filter.shadow_initial.rate, 0.f, 1.f);
  res = res && Limit(&c->filter.shadow_initial.noise_gate, 0.f, 100000000.f);

  if (c->filter.shadow.length_blocks < c->filter.shadow_initial.length_blocks) {
    c->filter.shadow_initial.length_blocks = c->filter.shadow.length_blocks;
    res = false;
  }

  res = res && Limit(&c->filter.config_change_duration_blocks, 0, 100000);
  res = res && Limit(&c->filter.initial_state_seconds, 0.f, 100.f);

  res = res && Limit(&c->erle.min, 1.f, 100000.f);
  res = res && Limit(&c->erle.max_l, 1.f, 100000.f);
  res = res && Limit(&c->erle.max_h, 1.f, 100000.f);
  if (c->erle.min > c->erle.max_l || c->erle.min > c->erle.max_h) {
    c->erle.min = std::min(c->erle.max_l, c->erle.max_h);
    res = false;
  }

  res = res && Limit(&c->ep_strength.lf, 0.f, 1000000.f);
  res = res && Limit(&c->ep_strength.mf, 0.f, 1000000.f);
  res = res && Limit(&c->ep_strength.hf, 0.f, 1000000.f);
  res = res && Limit(&c->ep_strength.default_len, 0.f, 1.f);

  res = res && Limit(&c->gain_mask.m0, 0.f, 1.f);
  res = res && Limit(&c->gain_mask.m1, 0.f, 1.f);
  res = res && Limit(&c->gain_mask.m2, 0.f, 1.f);
  res = res && Limit(&c->gain_mask.m3, 0.f, 1.f);
  res = res && Limit(&c->gain_mask.m5, 0.f, 1.f);
  res = res && Limit(&c->gain_mask.m6, 0.f, 1.f);
  res = res && Limit(&c->gain_mask.m7, 0.f, 1.f);
  res = res && Limit(&c->gain_mask.m8, 0.f, 1.f);
  res = res && Limit(&c->gain_mask.m9, 0.f, 1.f);

  res = res && Limit(&c->gain_mask.gain_curve_offset, 0.f, 1000.f);
  res = res && Limit(&c->gain_mask.gain_curve_slope, 0.f, 1000.f);
  res = res && Limit(&c->gain_mask.temporal_masking_lf, 0.f, 1000.f);
  res = res && Limit(&c->gain_mask.temporal_masking_hf, 0.f, 1000.f);
  res = res && Limit(&c->gain_mask.temporal_masking_lf_bands, 0, 65);

  res = res &&
        Limit(&c->echo_audibility.low_render_limit, 0.f, 32768.f * 32768.f);
  res = res &&
        Limit(&c->echo_audibility.normal_render_limit, 0.f, 32768.f * 32768.f);
  res = res && Limit(&c->echo_audibility.floor_power, 0.f, 32768.f * 32768.f);
  res = res && Limit(&c->echo_audibility.audibility_threshold_lf, 0.f,
                     32768.f * 32768.f);
  res = res && Limit(&c->echo_audibility.audibility_threshold_mf, 0.f,
                     32768.f * 32768.f);
  res = res && Limit(&c->echo_audibility.audibility_threshold_hf, 0.f,
                     32768.f * 32768.f);

  res = res &&
        Limit(&c->render_levels.active_render_limit, 0.f, 32768.f * 32768.f);
  res = res && Limit(&c->render_levels.poor_excitation_render_limit, 0.f,
                     32768.f * 32768.f);
  res = res && Limit(&c->render_levels.poor_excitation_render_limit_ds8, 0.f,
                     32768.f * 32768.f);

  res =
      res && Limit(&c->echo_removal_control.gain_rampup.initial_gain, 0.f, 1.f);
  res = res && Limit(&c->echo_removal_control.gain_rampup.first_non_zero_gain,
                     0.f, 1.f);
  res = res && Limit(&c->echo_removal_control.gain_rampup.non_zero_gain_blocks,
                     0, 100000);
  res = res &&
        Limit(&c->echo_removal_control.gain_rampup.full_gain_blocks, 0, 100000);

  res = res && Limit(&c->echo_model.noise_floor_hold, 0, 1000);
  res = res && Limit(&c->echo_model.min_noise_floor_power, 0, 2000000.f);
  res = res && Limit(&c->echo_model.stationary_gate_slope, 0, 1000000.f);
  res = res && Limit(&c->echo_model.noise_gate_power, 0, 1000000.f);
  res = res && Limit(&c->echo_model.noise_gate_slope, 0, 1000000.f);
  res = res && Limit(&c->echo_model.render_pre_window_size, 0, 100);
  res = res && Limit(&c->echo_model.render_post_window_size, 0, 100);
  res = res && Limit(&c->echo_model.render_pre_window_size_init, 0, 100);
  res = res && Limit(&c->echo_model.render_post_window_size_init, 0, 100);
  res = res && Limit(&c->echo_model.nonlinear_hold, 0, 100);
  res = res && Limit(&c->echo_model.nonlinear_release, 0, 1.f);

  res = res &&
        Limit(&c->suppressor.normal_tuning.mask_lf.enr_transparent, 0.f, 100.f);
  res = res &&
        Limit(&c->suppressor.normal_tuning.mask_lf.enr_suppress, 0.f, 100.f);
  res = res &&
        Limit(&c->suppressor.normal_tuning.mask_lf.emr_transparent, 0.f, 100.f);
  res = res &&
        Limit(&c->suppressor.normal_tuning.mask_hf.enr_transparent, 0.f, 100.f);
  res = res &&
        Limit(&c->suppressor.normal_tuning.mask_hf.enr_suppress, 0.f, 100.f);
  res = res &&
        Limit(&c->suppressor.normal_tuning.mask_hf.emr_transparent, 0.f, 100.f);
  res = res && Limit(&c->suppressor.normal_tuning.max_inc_factor, 0.f, 100.f);
  res =
      res && Limit(&c->suppressor.normal_tuning.max_dec_factor_lf, 0.f, 100.f);

  res = res && Limit(&c->suppressor.nearend_tuning.mask_lf.enr_transparent, 0.f,
                     100.f);
  res = res &&
        Limit(&c->suppressor.nearend_tuning.mask_lf.enr_suppress, 0.f, 100.f);
  res = res && Limit(&c->suppressor.nearend_tuning.mask_lf.emr_transparent, 0.f,
                     100.f);
  res = res && Limit(&c->suppressor.nearend_tuning.mask_hf.enr_transparent, 0.f,
                     100.f);
  res = res &&
        Limit(&c->suppressor.nearend_tuning.mask_hf.enr_suppress, 0.f, 100.f);
  res = res && Limit(&c->suppressor.nearend_tuning.mask_hf.emr_transparent, 0.f,
                     100.f);
  res = res && Limit(&c->suppressor.nearend_tuning.max_inc_factor, 0.f, 100.f);
  res =
      res && Limit(&c->suppressor.nearend_tuning.max_dec_factor_lf, 0.f, 100.f);

  res = res && Limit(&c->suppressor.dominant_nearend_detection.enr_threshold,
                     0.f, 1000000.f);
  res = res && Limit(&c->suppressor.dominant_nearend_detection.snr_threshold,
                     0.f, 1000000.f);
  res = res && Limit(&c->suppressor.dominant_nearend_detection.hold_duration, 0,
                     10000);
  res =
      res && Limit(&c->suppressor.dominant_nearend_detection.trigger_threshold,
                   0, 10000);

  res = res && Limit(&c->suppressor.high_bands_suppression.enr_threshold, 0.f,
                     1000000.f);
  res = res && Limit(&c->suppressor.high_bands_suppression.max_gain_during_echo,
                     0.f, 1.f);

  res = res && Limit(&c->suppressor.floor_first_increase, 0.f, 1000000.f);

  return res;
}
}  // namespace webrtc
