/*
 *  Copyright 2023 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 "pc/test/enable_fake_media.h"

#include <memory>
#include <utility>

#include "absl/base/nullability.h"
#include "api/environment/environment.h"
#include "api/peer_connection_interface.h"
#include "call/call.h"
#include "call/call_config.h"
#include "media/base/fake_media_engine.h"
#include "media/base/media_engine.h"
#include "pc/media_factory.h"
#include "rtc_base/checks.h"

namespace webrtc {

void EnableFakeMedia(
    PeerConnectionFactoryDependencies& deps,
    absl_nonnull std::unique_ptr<FakeMediaEngine> fake_media_engine) {
  class FakeMediaFactory : public MediaFactory {
   public:
    explicit FakeMediaFactory(
        absl_nonnull std::unique_ptr<FakeMediaEngine> fake)
        : fake_(std::move(fake)) {}

    std::unique_ptr<Call> CreateCall(CallConfig config) override {
      return Call::Create(std::move(config));
    }

    std::unique_ptr<MediaEngineInterface> CreateMediaEngine(
        const Environment& /*env*/,
        PeerConnectionFactoryDependencies& /*dependencies*/) override {
      RTC_CHECK(fake_ != nullptr)
          << "CreateMediaEngine can be called at most once.";
      return std::move(fake_);
    }

   private:
    absl_nullable std::unique_ptr<FakeMediaEngine> fake_;
  };

  deps.media_factory =
      std::make_unique<FakeMediaFactory>(std::move(fake_media_engine));
}

void EnableFakeMedia(PeerConnectionFactoryDependencies& deps) {
  EnableFakeMedia(deps, std::make_unique<FakeMediaEngine>());
}

}  // namespace webrtc
