// Copyright 2016 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 "chromecast/system/reboot/reboot_util.h"

#include "base/logging.h"
#include "base/no_destructor.h"
#include "chromecast/public/reboot_shlib.h"

// This is a partial implementation of the reboot_util.h interface.
// The remaining methods are defined in other reboot_util_*.cc depending
// on which platform/product they are for.

namespace chromecast {
namespace {
RebootUtil::RebootCallback& GetTestRebootCallback() {
  static base::NoDestructor<RebootUtil::RebootCallback> callback;
  return *callback;
}
}  // namespace

// static
bool RebootUtil::IsRebootSupported() {
  return RebootShlib::IsSupported();
}

// static
bool RebootUtil::IsValidRebootSource(RebootShlib::RebootSource reboot_source) {
  switch (reboot_source) {
    case RebootShlib::RebootSource::UNKNOWN:
    case RebootShlib::RebootSource::FORCED:
    case RebootShlib::RebootSource::API:
    case RebootShlib::RebootSource::NIGHTLY:
    case RebootShlib::RebootSource::OTA:
    case RebootShlib::RebootSource::WATCHDOG:
    case RebootShlib::RebootSource::PROCESS_MANAGER:
    case RebootShlib::RebootSource::CRASH_UPLOADER:
    case RebootShlib::RebootSource::FDR:
    case RebootShlib::RebootSource::HW_WATCHDOG:
    case RebootShlib::RebootSource::SW_OTHER:
      return true;
    default:
      return false;
  }
}

// static
bool RebootUtil::IsRebootSourceSupported(
    RebootShlib::RebootSource reboot_source) {
  return RebootShlib::IsSupported() &&
         RebootShlib::IsRebootSourceSupported(reboot_source);
}

// static
bool RebootUtil::RebootNow(RebootShlib::RebootSource reboot_source) {
  // If we have a testing callback avoid calling RebootShlib::RebootNow
  // because it will crash our test
  RebootUtil::RebootCallback& callback = GetTestRebootCallback();
  SetNextRebootSource(reboot_source);
  if (callback) {
    LOG(WARNING) << "Using reboot callback for test! Device will not reboot!";
    return callback.Run(reboot_source);
  }
  DCHECK(IsRebootSourceSupported(reboot_source));
  return RebootShlib::RebootNow(reboot_source);
}

// static
bool RebootUtil::IsFdrForNextRebootSupported() {
  return RebootShlib::IsSupported() &&
         RebootShlib::IsFdrForNextRebootSupported();
}

// static
void RebootUtil::SetFdrForNextReboot() {
  DCHECK(IsFdrForNextRebootSupported());
  RebootShlib::SetFdrForNextReboot();
}

// static
bool RebootUtil::IsOtaForNextRebootSupported() {
  return RebootShlib::IsSupported() &&
         RebootShlib::IsOtaForNextRebootSupported();
}

// static
void RebootUtil::SetOtaForNextReboot() {
  DCHECK(IsOtaForNextRebootSupported());
  RebootShlib::SetOtaForNextReboot();
}

// static
void RebootUtil::SetRebootCallbackForTest(
    const RebootUtil::RebootCallback& callback) {
  GetTestRebootCallback() = callback;
}

// static
void RebootUtil::ClearRebootCallbackForTest() {
  GetTestRebootCallback().Reset();
}

}  // namespace chromecast
