// 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/buffer_source.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/wrappable.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 BufferSource& server_certificate);

  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);

  script::EnvironmentSettings* 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_
