// 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_KEY_SYSTEM_ACCESS_H_
#define COBALT_DOM_EME_MEDIA_KEY_SYSTEM_ACCESS_H_

#include <string>

#include "cobalt/dom/eme/media_key_system_configuration.h"
#include "cobalt/script/environment_settings.h"
#include "cobalt/script/promise.h"
#include "cobalt/script/script_value_factory.h"
#include "cobalt/script/wrappable.h"

namespace cobalt {
namespace dom {
namespace eme {

// Provides access to a key system.
//   https://www.w3.org/TR/encrypted-media/#mediakeysystemaccess-interface
class MediaKeySystemAccess : public script::Wrappable {
 public:
  using InterfacePromise = script::Promise<scoped_refptr<script::Wrappable>>;

  // Custom, not in any spec.
  MediaKeySystemAccess(const std::string& key_system,
                       const MediaKeySystemConfiguration& configuration,
                       script::ScriptValueFactory* script_value_factory);

  // Web API: MediaKeySystemAccess.
  const std::string& key_system() const { return key_system_; }
  const MediaKeySystemConfiguration& GetConfiguration() const {
    return configuration_;
  }
  script::Handle<InterfacePromise> CreateMediaKeys(
      script::EnvironmentSettings* settings) const;

  DEFINE_WRAPPABLE_TYPE(MediaKeySystemAccess);

 private:
  ~MediaKeySystemAccess() override {}

  const std::string key_system_;
  const MediaKeySystemConfiguration configuration_;
  script::ScriptValueFactory* script_value_factory_;

  DISALLOW_COPY_AND_ASSIGN(MediaKeySystemAccess);
};

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

#endif  // COBALT_DOM_EME_MEDIA_KEY_SYSTEM_ACCESS_H_
