/*
 *  Copyright (c) 2014 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 <iostream>
#include <memory>

#include <string.h>

#include "gflags/gflags.h"
#include "webrtc/modules/audio_processing/include/audio_processing.h"
#include "webrtc/modules/audio_processing/test/aec_dump_based_simulator.h"
#include "webrtc/modules/audio_processing/test/audio_processing_simulator.h"
#include "webrtc/modules/audio_processing/test/wav_based_simulator.h"

namespace webrtc {
namespace test {
namespace {

const int kParameterNotSpecifiedValue = -10000;

const char kUsageDescription[] =
    "Usage: audioproc_f [options] -i <input.wav>\n"
    "                   or\n"
    "       audioproc_f [options] -dump_input <aec_dump>\n"
    "\n\n"
    "Command-line tool to simulate a call using the audio "
    "processing module, either based on wav files or "
    "protobuf debug dump recordings.";

DEFINE_string(dump_input, "", "Aec dump input filename");
DEFINE_string(dump_output, "", "Aec dump output filename");
DEFINE_string(i, "", "Forward stream input wav filename");
DEFINE_string(o, "", "Forward stream output wav filename");
DEFINE_string(ri, "", "Reverse stream input wav filename");
DEFINE_string(ro, "", "Reverse stream output wav filename");
DEFINE_string(artificial_nearend, "", "Artificial nearend wav filename");
DEFINE_int32(output_num_channels,
             kParameterNotSpecifiedValue,
             "Number of forward stream output channels");
DEFINE_int32(reverse_output_num_channels,
             kParameterNotSpecifiedValue,
             "Number of Reverse stream output channels");
DEFINE_int32(output_sample_rate_hz,
             kParameterNotSpecifiedValue,
             "Forward stream output sample rate in Hz");
DEFINE_int32(reverse_output_sample_rate_hz,
             kParameterNotSpecifiedValue,
             "Reverse stream output sample rate in Hz");
DEFINE_string(mic_positions,
              "",
              "Space delimited cartesian coordinates of microphones in "
              "meters. The coordinates of each point are contiguous. For a "
              "two element array: \"x1 y1 z1 x2 y2 z2\"");
DEFINE_int32(target_angle_degrees,
             90,
             "The azimuth of the target in degrees (0-359). Only applies to "
             "beamforming.");
DEFINE_bool(fixed_interface,
            false,
            "Use the fixed interface when operating on wav files");
DEFINE_int32(aec,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the echo canceller");
DEFINE_int32(aecm,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the mobile echo controller");
DEFINE_int32(ed,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate (0) the residual echo detector");
DEFINE_string(ed_graph, "", "Output filename for graph of echo likelihood");
DEFINE_int32(agc,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the AGC");
DEFINE_int32(agc2,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the AGC2");
DEFINE_int32(hpf,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the high-pass filter");
DEFINE_int32(ns,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the noise suppressor");
DEFINE_int32(ts,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the transient suppressor");
DEFINE_int32(bf,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the beamformer");
DEFINE_int32(ie,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the intelligibility enhancer");
DEFINE_int32(vad,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the voice activity detector");
DEFINE_int32(le,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the level estimator");
DEFINE_bool(all_default,
            false,
            "Activate all of the default components (will be overridden by any "
            "other settings)");
DEFINE_int32(aec_suppression_level,
             kParameterNotSpecifiedValue,
             "Set the aec suppression level (0-2)");
DEFINE_int32(delay_agnostic,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the AEC delay agnostic mode");
DEFINE_int32(extended_filter,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the AEC extended filter mode");
DEFINE_int32(drift_compensation,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the drift compensation");
DEFINE_int32(aec3,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the experimental AEC mode AEC3");
DEFINE_int32(lc,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the level control");
DEFINE_int32(experimental_agc,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the experimental AGC");
DEFINE_int32(
    refined_adaptive_filter,
    kParameterNotSpecifiedValue,
    "Activate (1) or deactivate(0) the refined adaptive filter functionality");
DEFINE_int32(aecm_routing_mode,
             kParameterNotSpecifiedValue,
             "Specify the AECM routing mode (0-4)");
DEFINE_int32(aecm_comfort_noise,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the AECM comfort noise");
DEFINE_int32(agc_mode,
             kParameterNotSpecifiedValue,
             "Specify the AGC mode (0-2)");
DEFINE_int32(agc_target_level,
             kParameterNotSpecifiedValue,
             "Specify the AGC target level (0-31)");
DEFINE_int32(agc_limiter,
             kParameterNotSpecifiedValue,
             "Activate (1) or deactivate(0) the level estimator");
DEFINE_int32(agc_compression_gain,
             kParameterNotSpecifiedValue,
             "Specify the AGC compression gain (0-90)");
DEFINE_int32(vad_likelihood,
             kParameterNotSpecifiedValue,
             "Specify the VAD likelihood (0-3)");
DEFINE_int32(ns_level,
             kParameterNotSpecifiedValue,
             "Specify the NS level (0-3)");
DEFINE_int32(stream_delay,
             kParameterNotSpecifiedValue,
             "Specify the stream delay in ms to use");
DEFINE_int32(stream_drift_samples,
             kParameterNotSpecifiedValue,
             "Specify the number of stream drift samples to use");
DEFINE_bool(performance_report, false, "Report the APM performance ");
DEFINE_bool(verbose, false, "Produce verbose output");
DEFINE_bool(bitexactness_report,
            false,
            "Report bitexactness for aec dump result reproduction");
DEFINE_bool(discard_settings_in_aecdump,
            false,
            "Discard any config settings specified in the aec dump");
DEFINE_bool(store_intermediate_output,
            false,
            "Creates new output files after each init");
DEFINE_string(custom_call_order_file, "", "Custom process API call order file");

void SetSettingIfSpecified(const std::string value,
                           rtc::Optional<std::string>* parameter) {
  if (value.compare("") != 0) {
    *parameter = rtc::Optional<std::string>(value);
  }
}

void SetSettingIfSpecified(int value, rtc::Optional<int>* parameter) {
  if (value != kParameterNotSpecifiedValue) {
    *parameter = rtc::Optional<int>(value);
  }
}

void SetSettingIfFlagSet(int32_t flag, rtc::Optional<bool>* parameter) {
  if (flag == 0) {
    *parameter = rtc::Optional<bool>(false);
  } else if (flag == 1) {
    *parameter = rtc::Optional<bool>(true);
  }
}

SimulationSettings CreateSettings() {
  SimulationSettings settings;
  if (FLAGS_all_default) {
    settings.use_le = rtc::Optional<bool>(true);
    settings.use_vad = rtc::Optional<bool>(true);
    settings.use_ie = rtc::Optional<bool>(false);
    settings.use_bf = rtc::Optional<bool>(false);
    settings.use_ts = rtc::Optional<bool>(true);
    settings.use_ns = rtc::Optional<bool>(true);
    settings.use_hpf = rtc::Optional<bool>(true);
    settings.use_agc = rtc::Optional<bool>(true);
    settings.use_aec = rtc::Optional<bool>(true);
    settings.use_aecm = rtc::Optional<bool>(false);
    settings.use_ed = rtc::Optional<bool>(false);
  }
  SetSettingIfSpecified(FLAGS_dump_input, &settings.aec_dump_input_filename);
  SetSettingIfSpecified(FLAGS_dump_output, &settings.aec_dump_output_filename);
  SetSettingIfSpecified(FLAGS_i, &settings.input_filename);
  SetSettingIfSpecified(FLAGS_o, &settings.output_filename);
  SetSettingIfSpecified(FLAGS_ri, &settings.reverse_input_filename);
  SetSettingIfSpecified(FLAGS_ro, &settings.reverse_output_filename);
  SetSettingIfSpecified(FLAGS_artificial_nearend,
                        &settings.artificial_nearend_filename);
  SetSettingIfSpecified(FLAGS_output_num_channels,
                        &settings.output_num_channels);
  SetSettingIfSpecified(FLAGS_reverse_output_num_channels,
                        &settings.reverse_output_num_channels);
  SetSettingIfSpecified(FLAGS_output_sample_rate_hz,
                        &settings.output_sample_rate_hz);
  SetSettingIfSpecified(FLAGS_reverse_output_sample_rate_hz,
                        &settings.reverse_output_sample_rate_hz);
  SetSettingIfSpecified(FLAGS_mic_positions, &settings.microphone_positions);
  settings.target_angle_degrees = FLAGS_target_angle_degrees;
  SetSettingIfFlagSet(FLAGS_aec, &settings.use_aec);
  SetSettingIfFlagSet(FLAGS_aecm, &settings.use_aecm);
  SetSettingIfFlagSet(FLAGS_ed, &settings.use_ed);
  SetSettingIfSpecified(FLAGS_ed_graph, &settings.ed_graph_output_filename);
  SetSettingIfFlagSet(FLAGS_agc, &settings.use_agc);
  SetSettingIfFlagSet(FLAGS_agc2, &settings.use_agc2);
  SetSettingIfFlagSet(FLAGS_hpf, &settings.use_hpf);
  SetSettingIfFlagSet(FLAGS_ns, &settings.use_ns);
  SetSettingIfFlagSet(FLAGS_ts, &settings.use_ts);
  SetSettingIfFlagSet(FLAGS_bf, &settings.use_bf);
  SetSettingIfFlagSet(FLAGS_ie, &settings.use_ie);
  SetSettingIfFlagSet(FLAGS_vad, &settings.use_vad);
  SetSettingIfFlagSet(FLAGS_le, &settings.use_le);
  SetSettingIfSpecified(FLAGS_aec_suppression_level,
                        &settings.aec_suppression_level);
  SetSettingIfFlagSet(FLAGS_delay_agnostic, &settings.use_delay_agnostic);
  SetSettingIfFlagSet(FLAGS_extended_filter, &settings.use_extended_filter);
  SetSettingIfFlagSet(FLAGS_drift_compensation,
                      &settings.use_drift_compensation);
  SetSettingIfFlagSet(FLAGS_refined_adaptive_filter,
                      &settings.use_refined_adaptive_filter);

  SetSettingIfFlagSet(FLAGS_aec3, &settings.use_aec3);
  SetSettingIfFlagSet(FLAGS_lc, &settings.use_lc);
  SetSettingIfFlagSet(FLAGS_experimental_agc, &settings.use_experimental_agc);
  SetSettingIfSpecified(FLAGS_aecm_routing_mode, &settings.aecm_routing_mode);
  SetSettingIfFlagSet(FLAGS_aecm_comfort_noise,
                      &settings.use_aecm_comfort_noise);
  SetSettingIfSpecified(FLAGS_agc_mode, &settings.agc_mode);
  SetSettingIfSpecified(FLAGS_agc_target_level, &settings.agc_target_level);
  SetSettingIfFlagSet(FLAGS_agc_limiter, &settings.use_agc_limiter);
  SetSettingIfSpecified(FLAGS_agc_compression_gain,
                        &settings.agc_compression_gain);
  SetSettingIfSpecified(FLAGS_vad_likelihood, &settings.vad_likelihood);
  SetSettingIfSpecified(FLAGS_ns_level, &settings.ns_level);
  SetSettingIfSpecified(FLAGS_stream_delay, &settings.stream_delay);
  SetSettingIfSpecified(FLAGS_stream_drift_samples,
                        &settings.stream_drift_samples);
  SetSettingIfSpecified(FLAGS_custom_call_order_file,
                        &settings.custom_call_order_filename);
  settings.report_performance = FLAGS_performance_report;
  settings.use_verbose_logging = FLAGS_verbose;
  settings.report_bitexactness = FLAGS_bitexactness_report;
  settings.discard_all_settings_in_aecdump = FLAGS_discard_settings_in_aecdump;
  settings.fixed_interface = FLAGS_fixed_interface;
  settings.store_intermediate_output = FLAGS_store_intermediate_output;

  return settings;
}

void ReportConditionalErrorAndExit(bool condition, std::string message) {
  if (condition) {
    std::cerr << message << std::endl;
    exit(1);
  }
}

void PerformBasicParameterSanityChecks(const SimulationSettings& settings) {
  if (settings.input_filename || settings.reverse_input_filename) {
    ReportConditionalErrorAndExit(!!settings.aec_dump_input_filename,
                                  "Error: The aec dump cannot be specified "
                                  "together with input wav files!\n");

    ReportConditionalErrorAndExit(!!settings.artificial_nearend_filename,
                                  "Error: The artificial nearend cannot be "
                                  "specified together with input wav files!\n");

    ReportConditionalErrorAndExit(!settings.input_filename,
                                  "Error: When operating at wav files, the "
                                  "input wav filename must be "
                                  "specified!\n");

    ReportConditionalErrorAndExit(
        settings.reverse_output_filename && !settings.reverse_input_filename,
        "Error: When operating at wav files, the reverse input wav filename "
        "must be specified if the reverse output wav filename is specified!\n");
  } else {
    ReportConditionalErrorAndExit(!settings.aec_dump_input_filename,
                                  "Error: Either the aec dump or the wav "
                                  "input files must be specified!\n");
  }

  ReportConditionalErrorAndExit(
      settings.use_aec && *settings.use_aec && settings.use_aecm &&
          *settings.use_aecm,
      "Error: The AEC and the AECM cannot be activated at the same time!\n");

  ReportConditionalErrorAndExit(
      settings.output_sample_rate_hz && *settings.output_sample_rate_hz <= 0,
      "Error: --output_sample_rate_hz must be positive!\n");

  ReportConditionalErrorAndExit(
      settings.reverse_output_sample_rate_hz &&
          settings.output_sample_rate_hz &&
          *settings.output_sample_rate_hz <= 0,
      "Error: --reverse_output_sample_rate_hz must be positive!\n");

  ReportConditionalErrorAndExit(
      settings.output_num_channels && *settings.output_num_channels <= 0,
      "Error: --output_num_channels must be positive!\n");

  ReportConditionalErrorAndExit(
      settings.reverse_output_num_channels &&
          *settings.reverse_output_num_channels <= 0,
      "Error: --reverse_output_num_channels must be positive!\n");

  ReportConditionalErrorAndExit(
      settings.use_bf && *settings.use_bf && !settings.microphone_positions,
      "Error: --mic_positions must be specified when the beamformer is "
      "activated.\n");

  ReportConditionalErrorAndExit(
      settings.target_angle_degrees < 0 || settings.target_angle_degrees > 359,
      "Error: -target_angle_degrees must be specified between 0 and 359.\n");

  ReportConditionalErrorAndExit(
      settings.aec_suppression_level &&
          ((*settings.aec_suppression_level) < 0 ||
           (*settings.aec_suppression_level) > 2),
      "Error: --aec_suppression_level must be specified between 0 and 2.\n");

  ReportConditionalErrorAndExit(
      settings.aecm_routing_mode && ((*settings.aecm_routing_mode) < 0 ||
                                     (*settings.aecm_routing_mode) > 4),
      "Error: --aecm_routing_mode must be specified between 0 and 4.\n");

  ReportConditionalErrorAndExit(
      settings.agc_target_level && ((*settings.agc_target_level) < 0 ||
                                    (*settings.agc_target_level) > 31),
      "Error: --agc_target_level must be specified between 0 and 31.\n");

  ReportConditionalErrorAndExit(
      settings.agc_compression_gain && ((*settings.agc_compression_gain) < 0 ||
                                        (*settings.agc_compression_gain) > 90),
      "Error: --agc_compression_gain must be specified between 0 and 90.\n");

  ReportConditionalErrorAndExit(
      settings.vad_likelihood &&
          ((*settings.vad_likelihood) < 0 || (*settings.vad_likelihood) > 3),
      "Error: --vad_likelihood must be specified between 0 and 3.\n");

  ReportConditionalErrorAndExit(
      settings.ns_level &&
          ((*settings.ns_level) < 0 || (*settings.ns_level) > 3),
      "Error: --ns_level must be specified between 0 and 3.\n");

  ReportConditionalErrorAndExit(
      settings.report_bitexactness && !settings.aec_dump_input_filename,
      "Error: --bitexactness_report can only be used when operating on an "
      "aecdump\n");

  ReportConditionalErrorAndExit(
      settings.custom_call_order_filename && settings.aec_dump_input_filename,
      "Error: --custom_call_order_file cannot be used when operating on an "
      "aecdump\n");

  auto valid_wav_name = [](const std::string& wav_file_name) {
    if (wav_file_name.size() < 5) {
      return false;
    }
    if ((wav_file_name.compare(wav_file_name.size() - 4, 4, ".wav") == 0) ||
        (wav_file_name.compare(wav_file_name.size() - 4, 4, ".WAV") == 0)) {
      return true;
    }
    return false;
  };

  ReportConditionalErrorAndExit(
      settings.input_filename && (!valid_wav_name(*settings.input_filename)),
      "Error: --i must be a valid .wav file name.\n");

  ReportConditionalErrorAndExit(
      settings.output_filename && (!valid_wav_name(*settings.output_filename)),
      "Error: --o must be a valid .wav file name.\n");

  ReportConditionalErrorAndExit(
      settings.reverse_input_filename &&
          (!valid_wav_name(*settings.reverse_input_filename)),
      "Error: --ri must be a valid .wav file name.\n");

  ReportConditionalErrorAndExit(
      settings.reverse_output_filename &&
          (!valid_wav_name(*settings.reverse_output_filename)),
      "Error: --ro must be a valid .wav file name.\n");

  ReportConditionalErrorAndExit(
      settings.artificial_nearend_filename &&
          !valid_wav_name(*settings.artificial_nearend_filename),
      "Error: --artifical_nearend must be a valid .wav file name.\n");
}

}  // namespace

int main(int argc, char* argv[]) {
  google::SetUsageMessage(kUsageDescription);
  google::ParseCommandLineFlags(&argc, &argv, true);

  SimulationSettings settings = CreateSettings();
  PerformBasicParameterSanityChecks(settings);
  std::unique_ptr<AudioProcessingSimulator> processor;

  if (settings.aec_dump_input_filename) {
    processor.reset(new AecDumpBasedSimulator(settings));
  } else {
    processor.reset(new WavBasedSimulator(settings));
  }

  processor->Process();

  if (settings.report_performance) {
    const auto& proc_time = processor->proc_time();
    int64_t exec_time_us = proc_time.sum / rtc::kNumNanosecsPerMicrosec;
    std::cout << std::endl
              << "Execution time: " << exec_time_us * 1e-6 << " s, File time: "
              << processor->get_num_process_stream_calls() * 1.f /
                     AudioProcessingSimulator::kChunksPerSecond
              << std::endl
              << "Time per fwd stream chunk (mean, max, min): " << std::endl
              << exec_time_us * 1.f / processor->get_num_process_stream_calls()
              << " us, " << 1.f * proc_time.max / rtc::kNumNanosecsPerMicrosec
              << " us, " << 1.f * proc_time.min / rtc::kNumNanosecsPerMicrosec
              << " us" << std::endl;
  }

  if (settings.report_bitexactness && settings.aec_dump_input_filename) {
    if (processor->OutputWasBitexact()) {
      std::cout << "The processing was bitexact.";
    } else {
      std::cout << "The processing was not bitexact.";
    }
  }

  return 0;
}

}  // namespace test
}  // namespace webrtc

int main(int argc, char* argv[]) {
  return webrtc::test::main(argc, argv);
}
