// 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/new_session_cdm_result_promise.h"

#include "base/logging.h"
#include "cobalt/media/blink/cdm_result_promise_helper.h"
#include "third_party/WebKit/public/platform/WebString.h"

namespace cobalt {
namespace media {

static blink::WebContentDecryptionModuleResult::SessionStatus ConvertStatus(
    SessionInitStatus status) {
  switch (status) {
    case SessionInitStatus::UNKNOWN_STATUS:
      break;
    case SessionInitStatus::NEW_SESSION:
      return blink::WebContentDecryptionModuleResult::NewSession;
    case SessionInitStatus::SESSION_NOT_FOUND:
      return blink::WebContentDecryptionModuleResult::SessionNotFound;
    case SessionInitStatus::SESSION_ALREADY_EXISTS:
      return blink::WebContentDecryptionModuleResult::SessionAlreadyExists;
  }
  NOTREACHED();
  return blink::WebContentDecryptionModuleResult::SessionNotFound;
}

NewSessionCdmResultPromise::NewSessionCdmResultPromise(
    const blink::WebContentDecryptionModuleResult& result,
    const std::string& uma_name,
    const SessionInitializedCB& new_session_created_cb)
    : web_cdm_result_(result),
      uma_name_(uma_name),
      new_session_created_cb_(new_session_created_cb) {}

NewSessionCdmResultPromise::~NewSessionCdmResultPromise() {
  if (!IsPromiseSettled()) RejectPromiseOnDestruction();
}

void NewSessionCdmResultPromise::resolve(const std::string& session_id) {
  // |new_session_created_cb_| uses a WeakPtr<> and may not do anything
  // if the session object has been destroyed.
  SessionInitStatus status = SessionInitStatus::UNKNOWN_STATUS;
  new_session_created_cb_.Run(session_id, &status);

  if (status == SessionInitStatus::UNKNOWN_STATUS) {
    reject(MediaKeys::INVALID_STATE_ERROR, 0,
           "Cannot finish session initialization");
    return;
  }

  MarkPromiseSettled();
  ReportCdmResultUMA(uma_name_, SUCCESS);
  web_cdm_result_.completeWithSession(ConvertStatus(status));
}

void NewSessionCdmResultPromise::reject(MediaKeys::Exception exception_code,
                                        uint32_t system_code,
                                        const std::string& error_message) {
  MarkPromiseSettled();
  ReportCdmResultUMA(uma_name_,
                     ConvertCdmExceptionToResultForUMA(exception_code));
  web_cdm_result_.completeWithError(ConvertCdmException(exception_code),
                                    system_code,
                                    blink::WebString::fromUTF8(error_message));
}

}  // namespace media
}  // namespace cobalt
