/*
 *  Copyright (c) 2022 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 TEST_PC_E2E_ANALYZER_VIDEO_ANALYZING_VIDEO_SINKS_HELPER_H_
#define TEST_PC_E2E_ANALYZER_VIDEO_ANALYZING_VIDEO_SINKS_HELPER_H_

#include <list>
#include <map>
#include <memory>
#include <set>
#include <string>
#include <utility>

#include "absl/strings/string_view.h"
#include "absl/types/optional.h"
#include "api/test/pclf/media_configuration.h"
#include "api/test/video/video_frame_writer.h"
#include "rtc_base/synchronization/mutex.h"
#include "rtc_base/thread_annotations.h"

namespace webrtc {
namespace webrtc_pc_e2e {

// Registry of known video configs and video writers.
// This class is thread safe.
class AnalyzingVideoSinksHelper {
 public:
  // Adds config in the registry. If config with such stream label was
  // registered before, the new value will override the old one.
  void AddConfig(absl::string_view sender_peer_name, VideoConfig config);
  absl::optional<std::pair<std::string, VideoConfig>> GetPeerAndConfig(
      absl::string_view stream_label);
  // Removes video config for specified stream label. If there are no know video
  // config for such stream label - does nothing.
  void RemoveConfig(absl::string_view stream_label);

  // Takes ownership of the provided video writer. All video writers owned by
  // this class will be closed during `AnalyzingVideoSinksHelper` destruction
  // and guaranteed to be alive either until explicitly removed by
  // `CloseAndRemoveVideoWriters` or until `AnalyzingVideoSinksHelper` is
  // destroyed.
  //
  // Returns pointer to the added writer. Ownership is maintained by
  // `AnalyzingVideoSinksHelper`.
  test::VideoFrameWriter* AddVideoWriter(
      std::unique_ptr<test::VideoFrameWriter> video_writer);
  // For each provided `writers_to_close`, if it is known, will close and
  // destroy it, otherwise does nothing with it.
  void CloseAndRemoveVideoWriters(
      std::set<test::VideoFrameWriter*> writers_to_close);

  // Removes all added configs and close and removes all added writers.
  void Clear();

 private:
  Mutex mutex_;
  std::map<std::string, std::pair<std::string, VideoConfig>> video_configs_
      RTC_GUARDED_BY(mutex_);
  std::list<std::unique_ptr<test::VideoFrameWriter>> video_writers_
      RTC_GUARDED_BY(mutex_);
};

}  // namespace webrtc_pc_e2e
}  // namespace webrtc

#endif  // TEST_PC_E2E_ANALYZER_VIDEO_ANALYZING_VIDEO_SINKS_HELPER_H_
