// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COBALT_MEDIA_BLINK_WEBENCRYPTEDMEDIACLIENT_IMPL_H_
#define COBALT_MEDIA_BLINK_WEBENCRYPTEDMEDIACLIENT_IMPL_H_

#include <memory>
#include <string>

#include "base/callback.h"
#include "base/memory/weak_ptr.h"
#include "base/scoped_ptr_hash_map.h"
#include "cobalt/media/blink/key_system_config_selector.h"
#include "cobalt/media/blink/media_blink_export.h"
#include "third_party/WebKit/public/platform/WebEncryptedMediaClient.h"

namespace blink {

class WebContentDecryptionModuleResult;
struct WebMediaKeySystemConfiguration;
class WebSecurityOrigin;

}  // namespace blink

namespace cobalt {
namespace media {

struct CdmConfig;
class CdmFactory;
class KeySystems;
class MediaPermission;

class MEDIA_BLINK_EXPORT WebEncryptedMediaClientImpl
    : public blink::WebEncryptedMediaClient {
 public:
  WebEncryptedMediaClientImpl(
      base::Callback<bool(void)> are_secure_codecs_supported_cb,
      CdmFactory* cdm_factory, MediaPermission* media_permission);
  ~WebEncryptedMediaClientImpl() OVERRIDE;

  // WebEncryptedMediaClient implementation.
  void requestMediaKeySystemAccess(
      blink::WebEncryptedMediaRequest request) OVERRIDE;

  // Create the CDM for |key_system| and |security_origin|. The caller owns
  // the created cdm (passed back using |result|).
  void CreateCdm(
      const blink::WebString& key_system,
      const blink::WebSecurityOrigin& security_origin,
      const CdmConfig& cdm_config,
      std::unique_ptr<blink::WebContentDecryptionModuleResult> result);

 private:
  // Report usage of key system to UMA. There are 2 different counts logged:
  // 1. The key system is requested.
  // 2. The requested key system and options are supported.
  // Each stat is only reported once per renderer frame per key system.
  class Reporter;

  // Complete a requestMediaKeySystemAccess() request with a supported
  // accumulated configuration.
  void OnRequestSucceeded(
      blink::WebEncryptedMediaRequest request,
      const blink::WebMediaKeySystemConfiguration& accumulated_configuration,
      const CdmConfig& cdm_config);

  // Complete a requestMediaKeySystemAccess() request with an error message.
  void OnRequestNotSupported(blink::WebEncryptedMediaRequest request,
                             const blink::WebString& error_message);

  // Gets the Reporter for |key_system|. If it doesn't already exist,
  // create one.
  Reporter* GetReporter(const blink::WebString& key_system);

  // Reporter singletons.
  base::ScopedPtrHashMap<std::string, std::unique_ptr<Reporter>> reporters_;

  base::Callback<bool(void)> are_secure_codecs_supported_cb_;
  CdmFactory* cdm_factory_;
  KeySystemConfigSelector key_system_config_selector_;
  base::WeakPtrFactory<WebEncryptedMediaClientImpl> weak_factory_;
};

}  // namespace media
}  // namespace cobalt

#endif  // COBALT_MEDIA_BLINK_WEBENCRYPTEDMEDIACLIENT_IMPL_H_
