// 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 "cobalt/media/blink/cdm_result_promise_helper.h"

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

namespace cobalt {
namespace media {

CdmResultForUMA ConvertCdmExceptionToResultForUMA(
    MediaKeys::Exception exception_code) {
  switch (exception_code) {
    case MediaKeys::NOT_SUPPORTED_ERROR:
      return NOT_SUPPORTED_ERROR;
    case MediaKeys::INVALID_STATE_ERROR:
      return INVALID_STATE_ERROR;
    case MediaKeys::INVALID_ACCESS_ERROR:
      return INVALID_ACCESS_ERROR;
    case MediaKeys::QUOTA_EXCEEDED_ERROR:
      return QUOTA_EXCEEDED_ERROR;
    case MediaKeys::UNKNOWN_ERROR:
      return UNKNOWN_ERROR;
    case MediaKeys::CLIENT_ERROR:
      return CLIENT_ERROR;
    case MediaKeys::OUTPUT_ERROR:
      return OUTPUT_ERROR;
  }
  NOTREACHED();
  return UNKNOWN_ERROR;
}

blink::WebContentDecryptionModuleException ConvertCdmException(
    MediaKeys::Exception exception_code) {
  switch (exception_code) {
    case MediaKeys::NOT_SUPPORTED_ERROR:
      return blink::WebContentDecryptionModuleExceptionNotSupportedError;
    case MediaKeys::INVALID_STATE_ERROR:
      return blink::WebContentDecryptionModuleExceptionInvalidStateError;
    case MediaKeys::INVALID_ACCESS_ERROR:
      return blink::WebContentDecryptionModuleExceptionInvalidAccessError;
    case MediaKeys::QUOTA_EXCEEDED_ERROR:
      return blink::WebContentDecryptionModuleExceptionQuotaExceededError;
    case MediaKeys::UNKNOWN_ERROR:
      return blink::WebContentDecryptionModuleExceptionUnknownError;
    case MediaKeys::CLIENT_ERROR:
      return blink::WebContentDecryptionModuleExceptionClientError;
    case MediaKeys::OUTPUT_ERROR:
      return blink::WebContentDecryptionModuleExceptionOutputError;
  }
  NOTREACHED();
  return blink::WebContentDecryptionModuleExceptionUnknownError;
}

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

  base::LinearHistogram::FactoryGet(
      uma_name, 1, NUM_RESULT_CODES, NUM_RESULT_CODES + 1,
      base::HistogramBase::kUmaTargetedHistogramFlag)
      ->Add(result);
}

}  // namespace media
}  // namespace cobalt
