// Copyright 2017 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_CAPTURE_MEDIA_DEVICES_H_
#define COBALT_MEDIA_CAPTURE_MEDIA_DEVICES_H_

#include <memory>
#include <string>
#include <vector>

#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/message_loop/message_loop.h"
#include "base/threading/thread_checker.h"
#include "cobalt/base/polymorphic_downcast.h"
#include "cobalt/dom/dom_settings.h"
#include "cobalt/dom/event_target.h"
#include "cobalt/media_capture/media_device_info.h"
#include "cobalt/media_stream/media_stream_audio_source.h"
#include "cobalt/media_stream/media_stream_constraints.h"
#include "cobalt/script/environment_settings.h"
#include "cobalt/script/promise.h"
#include "cobalt/script/script_value.h"
#include "cobalt/script/script_value_factory.h"
#include "cobalt/script/sequence.h"
#include "cobalt/script/wrappable.h"
#include "cobalt/speech/microphone.h"
#include "cobalt/speech/microphone_manager.h"

namespace cobalt {
namespace media_capture {

// The MediaDevices object is the entry point to the API used to examine and
// get access to media devices available to the User Agent.
//   https://www.w3.org/TR/mediacapture-streams/#mediadevices
class MediaDevices : public dom::EventTarget {
 public:
  using MediaInfoSequence = script::Sequence<scoped_refptr<script::Wrappable>>;
  using MediaInfoSequencePromise = script::Promise<MediaInfoSequence>;
  using MediaStreamPromise =
      script::Promise<script::ScriptValueFactory::WrappablePromise>;
  using MediaStreamPromiseValue = script::ScriptValue<MediaStreamPromise>;

  explicit MediaDevices(script::ScriptValueFactory* script_value_factory);

  script::Handle<MediaInfoSequencePromise> EnumerateDevices();
  script::Handle<MediaStreamPromise> GetUserMedia();
  script::Handle<MediaStreamPromise> GetUserMedia(
      const media_stream::MediaStreamConstraints& constraints);

  void SetEnvironmentSettings(script::EnvironmentSettings* settings) {
    settings_ = base::polymorphic_downcast<dom::DOMSettings*>(settings);
  }

  DEFINE_WRAPPABLE_TYPE(MediaDevices);

 private:
  friend class GetUserMediaTest;
  FRIEND_TEST_ALL_PREFIXES(GetUserMediaTest, PendingPromise);
  FRIEND_TEST_ALL_PREFIXES(GetUserMediaTest, MicrophoneStoppedRejectedPromise);
  FRIEND_TEST_ALL_PREFIXES(GetUserMediaTest, MicrophoneErrorRejectedPromise);
  FRIEND_TEST_ALL_PREFIXES(GetUserMediaTest, MicrophoneSuccessFulfilledPromise);
  FRIEND_TEST_ALL_PREFIXES(GetUserMediaTest,
                           MultipleMicrophoneSuccessFulfilledPromise);

  ~MediaDevices() override = default;

  // Stop callback used with MediaStreamAudioSource, and the OnMicrophoneError
  // logic will also call in to this.
  void OnMicrophoneStopped();

  // Callbacks used with MicrophoneManager.
  void OnMicrophoneError(speech::MicrophoneManager::MicrophoneError error,
                         std::string message);
  void OnMicrophoneSuccess();

  script::ScriptValueFactory* script_value_factory_;
  dom::DOMSettings* settings_ = nullptr;

  scoped_refptr<media_stream::MediaStreamAudioSource> audio_source_;

  scoped_refptr<media_stream::MediaStreamTrack> pending_microphone_track_;
  std::vector<std::unique_ptr<MediaStreamPromiseValue::Reference>>
      pending_microphone_promises_;

  base::MessageLoop* javascript_message_loop_;
  THREAD_CHECKER(thread_checker_);

  base::WeakPtrFactory<MediaDevices> weak_ptr_factory_;
  base::WeakPtr<MediaDevices> weak_this_;

  DISALLOW_COPY_AND_ASSIGN(MediaDevices);
};

}  // namespace media_capture
}  // namespace cobalt

#endif  // COBALT_MEDIA_CAPTURE_MEDIA_DEVICES_H_
