// 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_DOM_EME_MEDIA_KEYS_H_
#define COBALT_DOM_EME_MEDIA_KEYS_H_

#include <string>
#include <vector>

#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "cobalt/dom/dom_settings.h"
#include "cobalt/dom/eme/media_key_session.h"
#include "cobalt/dom/eme/media_key_session_type.h"
#include "cobalt/media/base/drm_system.h"
#include "cobalt/script/environment_settings.h"
#include "cobalt/script/script_value_factory.h"
#include "cobalt/script/typed_arrays.h"
#include "cobalt/script/wrappable.h"
#include "cobalt/web/buffer_source.h"
#include "cobalt/web/dom_exception.h"
#include "starboard/drm.h"

namespace cobalt {
namespace dom {
namespace eme {

// Represents a set of keys that an associated HTMLMediaElement can use
// for decryption of media data during playback.
//   https://www.w3.org/TR/encrypted-media/#mediakeys-interface
class MediaKeys : public script::Wrappable,
                  public base::SupportsWeakPtr<MediaKeys> {
 public:
  // Custom, not in any spec.
  typedef script::Handle<script::Promise<bool>> BoolPromiseHandle;
  typedef script::ScriptValue<script::Promise<bool>> BoolPromiseValue;

  MediaKeys(script::EnvironmentSettings* settings,
            const scoped_refptr<media::DrmSystem>& drm_system,
            script::ScriptValueFactory* script_value_factory);

  scoped_refptr<media::DrmSystem> drm_system() const { return drm_system_; }

  // Web API: MediaKeys.

  scoped_refptr<MediaKeySession> CreateSession(
      MediaKeySessionType session_type,
      script::ExceptionState* exception_state);
  BoolPromiseHandle SetServerCertificate(
      const web::BufferSource& server_certificate);
  script::Handle<script::Uint8Array> GetMetrics(
      script::ExceptionState* exception_state);

  DEFINE_WRAPPABLE_TYPE(MediaKeys);
  void TraceMembers(script::Tracer* tracer) override;

 private:
  ~MediaKeys() override;

  void OnSessionClosed(MediaKeySession* session);
  void OnServerCertificateUpdated(
      BoolPromiseValue::Reference* promise_reference, SbDrmStatus status,
      const std::string& error_message);

  DOMSettings* dom_settings_;
  script::ScriptValueFactory* script_value_factory_;
  scoped_refptr<media::DrmSystem> drm_system_;

  // A MediaKeySession object shall not be destroyed and shall continue
  // to receive events if it is not closed and the MediaKeys object that created
  // it remains accessible.
  //   https://www.w3.org/TR/encrypted-media/#mediakeysession-interface
  //
  // Number of sessions is expected to be very small, typically one.
  std::vector<scoped_refptr<MediaKeySession>> open_sessions_;

  DISALLOW_COPY_AND_ASSIGN(MediaKeys);
};

}  // namespace eme
}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_EME_MEDIA_KEYS_H_
