/*
 *  Copyright 2013 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.
 */

#ifndef PC_TEST_PEER_CONNECTION_TEST_WRAPPER_H_
#define PC_TEST_PEER_CONNECTION_TEST_WRAPPER_H_

#include <memory>
#include <optional>
#include <string>
#include <utility>
#include <vector>

#include "absl/functional/any_invocable.h"
#include "api/audio_codecs/audio_decoder_factory.h"
#include "api/audio_codecs/audio_encoder_factory.h"
#include "api/audio_options.h"
#include "api/data_channel_interface.h"
#include "api/environment/environment.h"
#include "api/field_trials_view.h"
#include "api/jsep.h"
#include "api/media_stream_interface.h"
#include "api/media_types.h"
#include "api/peer_connection_interface.h"
#include "api/rtc_error.h"
#include "api/rtp_parameters.h"
#include "api/rtp_receiver_interface.h"
#include "api/scoped_refptr.h"
#include "api/sequence_checker.h"
#include "api/video/resolution.h"
#include "api/video_codecs/video_decoder_factory.h"
#include "api/video_codecs/video_encoder_factory.h"
#include "pc/test/fake_audio_capture_module.h"
#include "pc/test/fake_periodic_video_source.h"
#include "pc/test/fake_periodic_video_track_source.h"
#include "pc/test/fake_video_track_renderer.h"
#include "rtc_base/callback_list.h"
#include "rtc_base/socket_server.h"
#include "rtc_base/thread.h"

namespace webrtc {

class PeerConnectionTestWrapper : public PeerConnectionObserver,
                                  public CreateSessionDescriptionObserver {
 public:
  // Asynchronously negotiates and exchanges ICE candidates between `caller` and
  // `callee`. See also WaitForNegotiation() and other "WaitFor..." methods.
  static void Connect(PeerConnectionTestWrapper* caller,
                      PeerConnectionTestWrapper* callee);
  // Synchronously negotiates. ICE candidates needs to be exchanged separately.
  static void AwaitNegotiation(PeerConnectionTestWrapper* caller,
                               PeerConnectionTestWrapper* callee);

  PeerConnectionTestWrapper(const std::string& name,
                            const Environment& env,
                            SocketServer* socket_server,
                            Thread* network_thread);
  ~PeerConnectionTestWrapper() override;

  bool CreatePc(const PeerConnectionInterface::RTCConfiguration& config,
                scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
                scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
                std::unique_ptr<FieldTrialsView> field_trials = nullptr);
  bool CreatePc(const PeerConnectionInterface::RTCConfiguration& config,
                scoped_refptr<AudioEncoderFactory> audio_encoder_factory,
                scoped_refptr<AudioDecoderFactory> audio_decoder_factory,
                std::unique_ptr<VideoEncoderFactory> video_encoder_factory,
                std::unique_ptr<VideoDecoderFactory> video_decoder_factory,
                std::unique_ptr<FieldTrialsView> field_trials = nullptr);

  scoped_refptr<PeerConnectionFactoryInterface> pc_factory() const {
    return peer_connection_factory_;
  }
  PeerConnectionInterface* pc() { return peer_connection_.get(); }

  scoped_refptr<DataChannelInterface> CreateDataChannel(
      const std::string& label,
      const DataChannelInit& init);

  std::optional<RtpCodecCapability> FindFirstSendCodecWithName(
      MediaType media_type,
      const std::string& name) const;

  void WaitForNegotiation();

  // Synchronous negotiation methods.
  std::unique_ptr<SessionDescriptionInterface> AwaitCreateOffer();
  std::unique_ptr<SessionDescriptionInterface> AwaitCreateAnswer();
  void AwaitSetLocalDescription(SessionDescriptionInterface* sdp);
  void AwaitSetRemoteDescription(SessionDescriptionInterface* sdp);
  // Listen for remote ICE candidates but don't add them until
  // AwaitAddRemoteIceCandidates().
  void ListenForRemoteIceCandidates(
      scoped_refptr<PeerConnectionTestWrapper> remote_wrapper);
  void AwaitAddRemoteIceCandidates();

  // Implements PeerConnectionObserver.
  void OnSignalingChange(
      PeerConnectionInterface::SignalingState new_state) override;
  void OnAddTrack(
      scoped_refptr<RtpReceiverInterface> receiver,
      const std::vector<scoped_refptr<MediaStreamInterface>>& streams) override;
  void OnDataChannel(scoped_refptr<DataChannelInterface> data_channel) override;
  void OnRenegotiationNeeded() override {}
  void OnIceConnectionChange(
      PeerConnectionInterface::IceConnectionState new_state) override {}
  void OnIceGatheringChange(
      PeerConnectionInterface::IceGatheringState new_state) override {}
  void OnIceCandidate(const IceCandidate* candidate) override;
  void OnIceCandidateRemoved(const IceCandidate* candidate) override {}

  // Implements CreateSessionDescriptionObserver.
  void OnSuccess(SessionDescriptionInterface* desc) override;
  void OnFailure(RTCError) override {}

  void CreateOffer(
      const PeerConnectionInterface::RTCOfferAnswerOptions& options);
  void CreateAnswer(
      const PeerConnectionInterface::RTCOfferAnswerOptions& options);
  void ReceiveOfferSdp(const std::string& sdp);
  void ReceiveAnswerSdp(const std::string& sdp);
  void AddIceCandidate(const std::string& sdp_mid,
                       int sdp_mline_index,
                       const std::string& candidate);
  bool WaitForCallEstablished();
  bool WaitForConnection();
  bool WaitForAudio();
  bool WaitForVideo();
  void GetAndAddUserMedia(bool audio,
                          const AudioOptions& audio_options,
                          bool video);

  // signal callbacks
  [[deprecated]] void SubscribeOnIceCandidateReady(
      absl::AnyInvocable<void(const std::string&, int, const std::string&)>
          callback) {
    on_ice_candidate_ready_callbacks_.AddReceiver(std::move(callback));
  }
  void SubscribeOnIceCandidateReady(
      void* tag,
      absl::AnyInvocable<void(const std::string&, int, const std::string&)>
          callback) {
    on_ice_candidate_ready_callbacks_.AddReceiver(tag, std::move(callback));
  }
  void NotifyOnIceCandidateReady(const std::string& mid,
                                 int index,
                                 const std::string& candidate) {
    on_ice_candidate_ready_callbacks_.Send(mid, index, candidate);
  }
  [[deprecated]] void SubscribeOnSdpReady(
      absl::AnyInvocable<void(const std::string&)> callback) {
    on_sdp_ready_callbacks_.AddReceiver(std::move(callback));
  }
  void SubscribeOnSdpReady(
      void* tag,
      absl::AnyInvocable<void(const std::string&)> callback) {
    on_sdp_ready_callbacks_.AddReceiver(tag, std::move(callback));
  }
  void NotifyOnSdpReady(const std::string& sdp) {
    on_sdp_ready_callbacks_.Send(sdp);
  }
  [[deprecated]] void SubscribeOnDataChannel(
      absl::AnyInvocable<void(DataChannelInterface*)> callback) {
    on_data_channel_callbacks_.AddReceiver(std::move(callback));
  }
  void SubscribeOnDataChannel(
      void* tag,
      absl::AnyInvocable<void(DataChannelInterface*)> callback) {
    on_data_channel_callbacks_.AddReceiver(tag, std::move(callback));
  }
  void NotifyOnDataChannel(DataChannelInterface* channel) {
    on_data_channel_callbacks_.Send(channel);
  }

  scoped_refptr<MediaStreamInterface> GetUserMedia(
      bool audio,
      const AudioOptions& audio_options,
      bool video,
      Resolution resolution = {
          .width = FakePeriodicVideoSource::kDefaultWidth,
          .height = FakePeriodicVideoSource::kDefaultHeight});
  void StopFakeVideoSources();

 private:
  void SetLocalDescription(SdpType type, const std::string& sdp);
  void SetRemoteDescription(SdpType type, const std::string& sdp);
  bool CheckForConnection();
  bool CheckForAudio();
  bool CheckForVideo();
  void OnRemoteIceCandidate(const std::string& sdp_mid,
                            int sdp_mline_index,
                            const std::string& candidate);

  std::string name_;
  const Environment env_;
  SocketServer* const socket_server_;
  Thread* const network_thread_;
  SequenceChecker pc_thread_checker_;
  scoped_refptr<PeerConnectionInterface> peer_connection_;
  scoped_refptr<PeerConnectionFactoryInterface> peer_connection_factory_;
  scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_;
  std::unique_ptr<FakeVideoTrackRenderer> renderer_;
  int num_get_user_media_calls_ = 0;
  bool pending_negotiation_;
  std::vector<scoped_refptr<FakePeriodicVideoTrackSource>> fake_video_sources_;
  scoped_refptr<PeerConnectionTestWrapper> remote_wrapper_;
  std::vector<std::unique_ptr<IceCandidate>> remote_ice_candidates_;

  CallbackList<const std::string&, int, const std::string&>
      on_ice_candidate_ready_callbacks_;
  CallbackList<const std::string&> on_sdp_ready_callbacks_;
  CallbackList<DataChannelInterface*> on_data_channel_callbacks_;
};

}  // namespace webrtc
#endif  // PC_TEST_PEER_CONNECTION_TEST_WRAPPER_H_
