// Copyright 2021 The Fuchsia 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 "src/developer/forensics/feedback/reboot_log/graceful_reboot_reason.h"

#include <lib/syslog/cpp/macros.h>

namespace forensics {
namespace feedback {
namespace {

constexpr char kReasonNotSet[] = "NOT SET";
constexpr char kReasonNone[] = "NONE";
constexpr char kReasonUserRequest[] = "USER REQUEST";
constexpr char kReasonSystemUpdate[] = "SYSTEM UPDATE";
constexpr char kReasonRetrySystemUpdate[] = "RETRY SYSTEM UPDATE";
constexpr char kReasonHighTemperature[] = "HIGH TEMPERATURE";
constexpr char kReasonSessionFailure[] = "SESSION FAILURE";
constexpr char kReasonSysmgrFailure[] = "SYSMGR FAILURE";
constexpr char kReasonCriticalComponentFailure[] = "CRITICAL COMPONENT FAILURE";
constexpr char kReasonFdr[] = "FACTORY DATA RESET";
constexpr char kReasonZbiSwap[] = "ZBI SWAP";
constexpr char kOutOfMemory[] = "OUT OF MEMORY";
constexpr char kReasonNotSupported[] = "NOT SUPPORTED";
constexpr char kReasonNotParseable[] = "NOT PARSEABLE";

}  // namespace

std::string ToString(const GracefulRebootReason reason) {
  switch (reason) {
    case GracefulRebootReason::kNotSet:
      return kReasonNotSet;
    case GracefulRebootReason::kNone:
      return kReasonNone;
    case GracefulRebootReason::kUserRequest:
      return kReasonUserRequest;
    case GracefulRebootReason::kSystemUpdate:
      return kReasonSystemUpdate;
    case GracefulRebootReason::kRetrySystemUpdate:
      return kReasonRetrySystemUpdate;
    case GracefulRebootReason::kHighTemperature:
      return kReasonHighTemperature;
    case GracefulRebootReason::kSessionFailure:
      return kReasonSessionFailure;
    case GracefulRebootReason::kSysmgrFailure:
      return kReasonSysmgrFailure;
    case GracefulRebootReason::kCriticalComponentFailure:
      return kReasonCriticalComponentFailure;
    case GracefulRebootReason::kFdr:
      return kReasonFdr;
    case GracefulRebootReason::kZbiSwap:
      return kReasonZbiSwap;
    case GracefulRebootReason::kOutOfMemory:
      return kOutOfMemory;
    case GracefulRebootReason::kNotSupported:
      return kReasonNotSupported;
    case GracefulRebootReason::kNotParseable:
      return kReasonNotParseable;
  }
}

std::string ToFileContent(const GracefulRebootReason reason) {
  switch (reason) {
    case GracefulRebootReason::kUserRequest:
    case GracefulRebootReason::kSystemUpdate:
    case GracefulRebootReason::kRetrySystemUpdate:
    case GracefulRebootReason::kHighTemperature:
    case GracefulRebootReason::kSessionFailure:
    case GracefulRebootReason::kSysmgrFailure:
    case GracefulRebootReason::kCriticalComponentFailure:
    case GracefulRebootReason::kFdr:
    case GracefulRebootReason::kZbiSwap:
    case GracefulRebootReason::kOutOfMemory:
    case GracefulRebootReason::kNotSupported:
      return ToString(reason);
    case GracefulRebootReason::kNotSet:
    case GracefulRebootReason::kNone:
    case GracefulRebootReason::kNotParseable:
      FX_LOGS(ERROR) << "Invalid persisted graceful reboot reason: " << ToString(reason);
      return kReasonNotSupported;
  }
}

GracefulRebootReason FromFileContent(const std::string reason) {
  if (reason == kReasonUserRequest) {
    return GracefulRebootReason::kUserRequest;
  } else if (reason == kReasonSystemUpdate) {
    return GracefulRebootReason::kSystemUpdate;
  } else if (reason == kReasonRetrySystemUpdate) {
    return GracefulRebootReason::kRetrySystemUpdate;
  } else if (reason == kReasonHighTemperature) {
    return GracefulRebootReason::kHighTemperature;
  } else if (reason == kReasonSessionFailure) {
    return GracefulRebootReason::kSessionFailure;
  } else if (reason == kReasonSysmgrFailure) {
    return GracefulRebootReason::kSysmgrFailure;
  } else if (reason == kReasonCriticalComponentFailure) {
    return GracefulRebootReason::kCriticalComponentFailure;
  } else if (reason == kReasonFdr) {
    return GracefulRebootReason::kFdr;
  } else if (reason == kReasonZbiSwap) {
    return GracefulRebootReason::kZbiSwap;
  } else if (reason == kReasonNotSupported) {
    return GracefulRebootReason::kNotSupported;
  } else if (reason == kOutOfMemory) {
    return GracefulRebootReason::kOutOfMemory;
  }

  FX_LOGS(ERROR) << "Invalid persisted graceful reboot reason: " << reason;
  return GracefulRebootReason::kNotParseable;
}

GracefulRebootReason ToGracefulRebootReason(
    const fuchsia::hardware::power::statecontrol::RebootReason reason) {
  using fuchsia::hardware::power::statecontrol::RebootReason;

  switch (reason) {
    case RebootReason::USER_REQUEST:
      return GracefulRebootReason::kUserRequest;
    case RebootReason::SYSTEM_UPDATE:
      return GracefulRebootReason::kSystemUpdate;
    case RebootReason::RETRY_SYSTEM_UPDATE:
      return GracefulRebootReason::kRetrySystemUpdate;
    case RebootReason::HIGH_TEMPERATURE:
      return GracefulRebootReason::kHighTemperature;
    case RebootReason::SESSION_FAILURE:
      return GracefulRebootReason::kSessionFailure;
    case RebootReason::SYSMGR_FAILURE:
      return GracefulRebootReason::kSysmgrFailure;
    case RebootReason::CRITICAL_COMPONENT_FAILURE:
      return GracefulRebootReason::kCriticalComponentFailure;
    case RebootReason::FACTORY_DATA_RESET:
      return GracefulRebootReason::kFdr;
    case RebootReason::ZBI_SWAP:
      return GracefulRebootReason::kZbiSwap;
    case RebootReason::OUT_OF_MEMORY:
      return GracefulRebootReason::kOutOfMemory;
    default:
      return GracefulRebootReason::kNotSupported;
  }
}

}  // namespace feedback
}  // namespace forensics
