/*
 *  Copyright (c) 2017 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 "modules/audio_processing/test/conversational_speech/mock_wavreader_factory.h"

#include "absl/strings/string_view.h"
#include "modules/audio_processing/test/conversational_speech/mock_wavreader.h"
#include "rtc_base/logging.h"
#include "test/gmock.h"

namespace webrtc {
namespace test {
namespace conversational_speech {

using ::testing::_;
using ::testing::Invoke;

MockWavReaderFactory::MockWavReaderFactory(
    const Params& default_params,
    const std::map<std::string, const Params>& params)
    : default_params_(default_params), audiotrack_names_params_(params) {
  ON_CALL(*this, Create(_))
      .WillByDefault(Invoke(this, &MockWavReaderFactory::CreateMock));
}

MockWavReaderFactory::MockWavReaderFactory(const Params& default_params)
    : MockWavReaderFactory(default_params,
                           std::map<std::string, const Params>{}) {}

MockWavReaderFactory::~MockWavReaderFactory() = default;

std::unique_ptr<WavReaderInterface> MockWavReaderFactory::CreateMock(
    absl::string_view filepath) {
  // Search the parameters corresponding to filepath.
  size_t delimiter = filepath.find_last_of("/\\");  // Either windows or posix
  std::string filename(filepath.substr(
      delimiter == absl::string_view::npos ? 0 : delimiter + 1));
  const auto it = audiotrack_names_params_.find(filename);

  // If not found, use default parameters.
  if (it == audiotrack_names_params_.end()) {
    RTC_LOG(LS_VERBOSE) << "using default parameters for " << filepath;
    return std::unique_ptr<WavReaderInterface>(new MockWavReader(
        default_params_.sample_rate, default_params_.num_channels,
        default_params_.num_samples));
  }

  // Found, use the audiotrack-specific parameters.
  RTC_LOG(LS_VERBOSE) << "using ad-hoc parameters for " << filepath;
  RTC_LOG(LS_VERBOSE) << "sample_rate " << it->second.sample_rate;
  RTC_LOG(LS_VERBOSE) << "num_channels " << it->second.num_channels;
  RTC_LOG(LS_VERBOSE) << "num_samples " << it->second.num_samples;
  return std::unique_ptr<WavReaderInterface>(new MockWavReader(
      it->second.sample_rate, it->second.num_channels, it->second.num_samples));
}

}  // namespace conversational_speech
}  // namespace test
}  // namespace webrtc
