// 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 <string>
#include <vector>

#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/message_loop_proxy.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);

  ~MediaDevices() override = default;

  // Stop callback used with MediaStreamAudioSource.
  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_;

  scoped_refptr<base::MessageLoopProxy> javascript_message_loop_;
  base::ThreadChecker 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_
