// Copyright 2018 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_MEDIA_STREAM_MEDIA_STREAM_H_
#define COBALT_MEDIA_STREAM_MEDIA_STREAM_H_

#include <utility>

#include "base/memory/ref_counted.h"
#include "cobalt/media_stream/media_stream_track.h"
#include "cobalt/script/sequence.h"
#include "cobalt/script/wrappable.h"
#include "cobalt/web/event_target.h"

namespace cobalt {
namespace media_stream {

// This class represents a MediaStream, and implements the specification at:
// https://www.w3.org/TR/mediacapture-streams/#dom-mediastream
class MediaStream : public web::EventTarget {
 public:
  using TrackSequences = script::Sequence<scoped_refptr<MediaStreamTrack>>;

  // Constructors.
  explicit MediaStream(script::EnvironmentSettings* settings)
      : web::EventTarget(settings) {}

  MediaStream(script::EnvironmentSettings* settings, TrackSequences tracks)
      : web::EventTarget(settings), tracks_(std::move(tracks)) {}

  // Functions.
  script::Sequence<scoped_refptr<MediaStreamTrack>>& GetAudioTracks() {
    return tracks_;
  }

  script::Sequence<scoped_refptr<MediaStreamTrack>>& GetTracks() {
    return GetAudioTracks();
  }

  void TraceMembers(script::Tracer* tracer) override {
    web::EventTarget::TraceMembers(tracer);
    tracer->TraceItems(tracks_);
  }

  DEFINE_WRAPPABLE_TYPE(MediaStream);

 private:
  MediaStream(const MediaStream&) = delete;
  MediaStream& operator=(const MediaStream&) = delete;

  script::Sequence<scoped_refptr<MediaStreamTrack>> tracks_;
};

}  // namespace media_stream
}  // namespace cobalt

#endif  // COBALT_MEDIA_STREAM_MEDIA_STREAM_H_
