// Copyright 2018 Google Inc. 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 "base/memory/ref_counted.h"
#include "cobalt/dom/event_target.h"
#include "cobalt/media_stream/media_stream_track.h"
#include "cobalt/script/sequence.h"
#include "cobalt/script/wrappable.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 dom::EventTarget {
 public:
  using TrackSequences = script::Sequence<scoped_refptr<MediaStreamTrack>>;

  // Constructors.
  MediaStream() = default;

  explicit MediaStream(TrackSequences tracks): 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 {
    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_
