// Copyright 2024 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef QUICHE_QUIC_MOQT_MOQT_KNOWN_TRACK_PUBLISHER_H_
#define QUICHE_QUIC_MOQT_MOQT_KNOWN_TRACK_PUBLISHER_H_

#include <memory>

#include "absl/base/nullability.h"
#include "absl/container/flat_hash_map.h"
#include "quiche/quic/moqt/moqt_messages.h"
#include "quiche/quic/moqt/moqt_publisher.h"

namespace moqt {

// MoqtKnownTrackPublisher is a publisher that supports publishing a set of
// well-known predefined tracks.
class MoqtKnownTrackPublisher : public MoqtPublisher {
 public:
  MoqtKnownTrackPublisher() = default;
  MoqtKnownTrackPublisher(const MoqtKnownTrackPublisher&) = delete;
  MoqtKnownTrackPublisher(MoqtKnownTrackPublisher&&) = delete;
  MoqtKnownTrackPublisher& operator=(const MoqtKnownTrackPublisher&) = delete;
  MoqtKnownTrackPublisher& operator=(MoqtKnownTrackPublisher&&) = delete;

  // MoqtPublisher implementation.
  absl_nullable std::shared_ptr<MoqtTrackPublisher> GetTrack(
      const FullTrackName& track_name) override;
  // TODO(martinduke): Implement namespace support.
  void AddNamespaceListener(NamespaceListener* /*listener*/) override {}
  void RemoveNamespaceListener(NamespaceListener* /*listener*/) override {}

  void Add(std::shared_ptr<MoqtTrackPublisher> track_publisher);
  void Delete(const FullTrackName& track_name);

 private:
  absl::flat_hash_map<FullTrackName, std::shared_ptr<MoqtTrackPublisher>>
      tracks_;
};

}  // namespace moqt

#endif  // QUICHE_QUIC_MOQT_MOQT_KNOWN_TRACK_PUBLISHER_H_
