// 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.

#include "media/blink/cdm_result_promise_helper.h"

#include "base/logging.h"
#include "base/metrics/histogram_functions.h"

namespace media {

CdmResultForUMA ConvertCdmExceptionToResultForUMA(
    CdmPromise::Exception exception_code) {
  switch (exception_code) {
    case CdmPromise::Exception::NOT_SUPPORTED_ERROR:
      return NOT_SUPPORTED_ERROR;
    case CdmPromise::Exception::INVALID_STATE_ERROR:
      return INVALID_STATE_ERROR;
    case CdmPromise::Exception::QUOTA_EXCEEDED_ERROR:
      return QUOTA_EXCEEDED_ERROR;
    case CdmPromise::Exception::TYPE_ERROR:
      return TYPE_ERROR;
  }
  NOTREACHED();
  return INVALID_STATE_ERROR;
}

blink::WebContentDecryptionModuleException ConvertCdmException(
    CdmPromise::Exception exception_code) {
  switch (exception_code) {
    case CdmPromise::Exception::NOT_SUPPORTED_ERROR:
      return blink::kWebContentDecryptionModuleExceptionNotSupportedError;
    case CdmPromise::Exception::INVALID_STATE_ERROR:
      return blink::kWebContentDecryptionModuleExceptionInvalidStateError;
    case CdmPromise::Exception::QUOTA_EXCEEDED_ERROR:
      return blink::kWebContentDecryptionModuleExceptionQuotaExceededError;
    case CdmPromise::Exception::TYPE_ERROR:
      return blink::kWebContentDecryptionModuleExceptionTypeError;
  }
  NOTREACHED();
  return blink::kWebContentDecryptionModuleExceptionInvalidStateError;
}

blink::WebEncryptedMediaKeyInformation::KeyStatus ConvertCdmKeyStatus(
    media::CdmKeyInformation::KeyStatus key_status) {
  switch (key_status) {
    case media::CdmKeyInformation::USABLE:
      return blink::WebEncryptedMediaKeyInformation::KeyStatus::kUsable;
    case media::CdmKeyInformation::INTERNAL_ERROR:
      return blink::WebEncryptedMediaKeyInformation::KeyStatus::kInternalError;
    case media::CdmKeyInformation::EXPIRED:
      return blink::WebEncryptedMediaKeyInformation::KeyStatus::kExpired;
    case media::CdmKeyInformation::OUTPUT_RESTRICTED:
      return blink::WebEncryptedMediaKeyInformation::KeyStatus::
          kOutputRestricted;
    case media::CdmKeyInformation::OUTPUT_DOWNSCALED:
      return blink::WebEncryptedMediaKeyInformation::KeyStatus::
          kOutputDownscaled;
    case media::CdmKeyInformation::KEY_STATUS_PENDING:
      return blink::WebEncryptedMediaKeyInformation::KeyStatus::kStatusPending;
    case media::CdmKeyInformation::RELEASED:
      return blink::WebEncryptedMediaKeyInformation::KeyStatus::kReleased;
  }
  NOTREACHED();
  return blink::WebEncryptedMediaKeyInformation::KeyStatus::kInternalError;
}

void ReportCdmResultUMA(const std::string& uma_name, CdmResultForUMA result) {
  if (uma_name.empty())
    return;

  base::UmaHistogramEnumeration(uma_name, result, NUM_RESULT_CODES);
}

}  // namespace media
