// Copyright (c) 2012 The Chromium OS 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 "power_manager/common/power_constants.h"

#include <base/logging.h>
#include <base/notreached.h>
#include <base/strings/stringprintf.h>

namespace power_manager {

// Prefs.
const char kLowBatteryShutdownTimePref[] = "low_battery_shutdown_time_s";
const char kLowBatteryShutdownPercentPref[] = "low_battery_shutdown_percent";
const char kPluggedDimMsPref[] = "plugged_dim_ms";
const char kPluggedOffMsPref[] = "plugged_off_ms";
const char kPluggedSuspendMsPref[] = "plugged_suspend_ms";
const char kUnpluggedDimMsPref[] = "unplugged_dim_ms";
const char kUnpluggedOffMsPref[] = "unplugged_off_ms";
const char kUnpluggedSuspendMsPref[] = "unplugged_suspend_ms";
const char kDisableIdleSuspendPref[] = "disable_idle_suspend";
const char kFactoryModePref[] = "factory_mode";
const char kUseLidPref[] = "use_lid";
const char kDetectHoverPref[] = "detect_hover";
const char kRetrySuspendMsPref[] = "retry_suspend_ms";
const char kRetrySuspendAttemptsPref[] = "retry_suspend_attempts";
const char kMinVisibleBacklightLevelPref[] = "min_visible_backlight_level";
const char kInstantTransitionsBelowMinLevelPref[] =
    "instant_transitions_below_min_level";
const char kAvoidSuspendWhenHeadphoneJackPluggedPref[] =
    "avoid_suspend_when_headphone_jack_plugged";
const char kWakeupInputPref[] = "wakeup_input_device_names";
const char kPowerSupplyFullFactorPref[] = "power_supply_full_factor";
const char kInternalBacklightMaxNitsPref[] = "internal_backlight_max_nits";
const char kInternalBacklightAlsStepsPref[] = "internal_backlight_als_steps";
const char kInternalBacklightNoAlsAcBrightnessPref[] =
    "internal_backlight_no_als_ac_brightness";
const char kInternalBacklightNoAlsBatteryBrightnessPref[] =
    "internal_backlight_no_als_battery_brightness";
const char kKeyboardBacklightAlsStepsPref[] = "keyboard_backlight_als_steps";
const char kKeyboardBacklightUserStepsPref[] = "keyboard_backlight_user_steps";
const char kKeyboardBacklightNoAlsBrightnessPref[] =
    "keyboard_backlight_no_als_brightness";
const char kKeyboardBacklightKeepOnMsPref[] = "keyboard_backlight_keep_on_ms";
const char kKeyboardBacklightKeepOnDuringVideoMsPref[] =
    "keyboard_backlight_keep_on_during_video_ms";
const char kKeyboardBacklightTurnOnForUserActivityPref[] =
    "keyboard_backlight_turn_on_for_user_activity";
const char kAlsSmoothingConstantPref[] = "als_smoothing_constant";
const char kRequireUsbInputDeviceToSuspendPref[] =
    "require_usb_input_device_to_suspend";
const char kBatteryPollIntervalPref[] = "battery_poll_interval_ms";
const char kBatteryPollIntervalInitialPref[] =
    "battery_poll_interval_initial_ms";
const char kBatteryStabilizedAfterStartupMsPref[] =
    "battery_stabilized_after_startup_ms";
const char kBatteryStabilizedAfterLinePowerConnectedMsPref[] =
    "battery_stabilized_after_line_power_connected_ms";
const char kBatteryStabilizedAfterLinePowerDisconnectedMsPref[] =
    "battery_stabilized_after_line_power_disconnected_ms";
const char kBatteryStabilizedAfterResumeMsPref[] =
    "battery_stabilized_after_resume_ms";
const char kMultipleBatteriesPref[] = "multiple_batteries";
const char kMaxCurrentSamplesPref[] = "max_current_samples";
const char kMaxChargeSamplesPref[] = "max_charge_samples";
const char kUsbMinAcWattsPref[] = "usb_min_ac_watts";
const char kChargingPortsPref[] = "charging_ports";
const char kTurnOffScreenTimeoutMsPref[] = "turn_off_screen_timeout_ms";
const char kDisableDarkResumePref[] = "disable_dark_resume";
const char kShutdownFromSuspendSecPref[] = "shutdown_from_suspend_sec";
const char kDarkResumeDevicesPref[] = "dark_resume_devices";
const char kDarkResumeSourcesPref[] = "dark_resume_sources";
const char kIgnoreExternalPolicyPref[] = "ignore_external_policy";
const char kNumSessionsOnCurrentChargePref[] = "num_sessions_on_current_charge";
const char kHasAmbientLightSensorPref[] = "has_ambient_light_sensor";
const char kAllowAmbientEQ[] = "allow_ambient_eq";
const char kHasChargeControllerPref[] = "has_charge_controller";
const char kHasKeyboardBacklightPref[] = "has_keyboard_backlight";
const char kExternalDisplayOnlyPref[] = "external_display_only";
const char kLegacyPowerButtonPref[] = "legacy_power_button";
const char kMosysEventlogPref[] = "mosys_eventlog";
const char kUseCrasPref[] = "use_cras";
const char kTpmCounterSuspendThresholdPref[] = "tpm_counter_suspend_threshold";
const char kTpmStatusIntervalSecPref[] = "tpm_status_interval_sec";
const char kSuspendToIdlePref[] = "suspend_to_idle";
const char kSetTransmitPowerPreferFarForProximityPref[] =
    "set_transmit_power_prefer_far_for_proximity";
const char kSetWifiTransmitPowerForTabletModePref[] =
    "set_wifi_transmit_power_for_tablet_mode";
const char kSetWifiTransmitPowerForProximityPref[] =
    "set_wifi_transmit_power_for_proximity";
const char kSetWifiTransmitPowerForActivityProximityPref[] =
    "set_wifi_transmit_power_for_activity_proximity";
const char kSetCellularTransmitPowerForTabletModePref[] =
    "set_cellular_transmit_power_for_tablet_mode";
const char kSetCellularTransmitPowerForProximityPref[] =
    "set_cellular_transmit_power_for_proximity";
const char kSetCellularTransmitPowerForActivityProximityPref[] =
    "set_cellular_transmit_power_for_activity_proximity";
const char kSetCellularTransmitPowerDprGpioPref[] =
    "set_cellular_transmit_power_dpr_gpio";
const char kUseModemManagerForDynamicSARPref[] =
    "use_modemmanager_for_dynamic_sar";
const char kUseMultiPowerLevelDynamicSARPref[] =
    "use_multi_power_level_dynamic_sar";
const char kSetCellularTransmitPowerLevelMappingPref[] =
    "set_cellular_transmit_power_level_mapping";
const char kEnableConsoleDuringSuspendPref[] = "enable_console_during_suspend";
const char kMaxDarkSuspendDelayTimeoutMsPref[] =
    "max_dark_suspend_delay_timeout_ms";
const char kSuspendModePref[] = "suspend_mode";
const char kWakeOnDpPref[] = "wake_on_dp";
const char kSmartDischargeToZeroHrPref[] = "smart_discharge_to_zero_hr";
const char kCutoffPowerUaPref[] = "cutoff_power_ua";
const char kHibernatePowerUaPref[] = "hibernate_power_ua";
const char kDeferExternalDisplayTimeoutPref[] =
    "defer_external_display_timeout";
const char kExternalAmbientLightSensorPref[] = "external_ambient_light_sensor";
const char kExternalBacklightAlsStepsPref[] = "external_backlight_als_steps";

// This pref is incomplete. Prefs based on it are defined by other packages
// populating them.
const char kSuspendFreezerDepsPrefix[] = "suspend_freezer_deps_";

// Miscellaneous constants.
const char kCrosFpInputDevName[] = "cros_fp_input";
const char kInternalBacklightPath[] = "/sys/class/backlight";
const char kInternalBacklightPattern[] = "*";
const char kKeyboardBacklightPath[] = "/sys/class/leds";
const char kKeyboardBacklightPattern[] = "*:kbd_backlight";
const char kKeyboardBacklightUdevSubsystem[] = "leds";
const char kPowerStatusPath[] = "/sys/class/power_supply";
const char kSetuidHelperPath[] = "/usr/bin/powerd_setuid_helper";
const char kBusServiceName[] = "org.freedesktop.DBus";
const char kBusServicePath[] = "/org/freedesktop/DBus";
const char kBusInterface[] = "org.freedesktop.DBus";
const char kBusNameOwnerChangedSignal[] = "NameOwnerChanged";
const char kPowerWakeup[] = "power/wakeup";
const double kEpsilon = 0.001;
const int64_t kFastBacklightTransitionMs = 200;
const int64_t kSlowBacklightTransitionMs = 2000;
const char kInputUdevSubsystem[] = "input";
const char kCrosECLightName[] = "cros-ec-light";
const char kAcpiAlsName[] = "acpi-als";

std::string PowerSourceToString(PowerSource source) {
  switch (source) {
    case PowerSource::AC:
      return "AC";
    case PowerSource::BATTERY:
      return "battery";
  }
  NOTREACHED() << "Unhandled power source " << static_cast<int>(source);
  return base::StringPrintf("unknown (%d)", static_cast<int>(source));
}

std::string LidStateToString(LidState state) {
  switch (state) {
    case LidState::OPEN:
      return "open";
    case LidState::CLOSED:
      return "closed";
    case LidState::NOT_PRESENT:
      return "not present";
  }
  NOTREACHED() << "Unhandled lid state " << static_cast<int>(state);
  return base::StringPrintf("unknown (%d)", static_cast<int>(state));
}

std::string TabletModeToString(TabletMode mode) {
  switch (mode) {
    case TabletMode::ON:
      return "on";
    case TabletMode::OFF:
      return "off";
    case TabletMode::UNSUPPORTED:
      return "unsupported";
  }
  NOTREACHED() << "Unhandled tablet mode " << static_cast<int>(mode);
  return base::StringPrintf("unknown (%d)", static_cast<int>(mode));
}

std::string UserProximityToString(UserProximity proximity) {
  switch (proximity) {
    case UserProximity::NEAR:
      return "near";
    case UserProximity::FAR:
      return "far";
    case UserProximity::UNKNOWN:
      return "unknown";
  }
  NOTREACHED() << "Unhandled user proximity " << static_cast<int>(proximity);
  return base::StringPrintf("unknown (%d)", static_cast<int>(proximity));
}

std::string RadioTransmitPowerToString(RadioTransmitPower power) {
  switch (power) {
    case RadioTransmitPower::LOW:
      return "low";
    case RadioTransmitPower::MEDIUM:
      return "medium";
    case RadioTransmitPower::HIGH:
      return "high";
    case RadioTransmitPower::UNSPECIFIED:
      return "unspecified";
  }
  NOTREACHED() << "Unhandled Radio transmit power " << static_cast<int>(power);
  return base::StringPrintf("unknown (%d)", static_cast<int>(power));
}

std::string SessionStateToString(SessionState state) {
  switch (state) {
    case SessionState::STOPPED:
      return "stopped";
    case SessionState::STARTED:
      return "started";
  }
  NOTREACHED() << "Unhandled session state " << static_cast<int>(state);
  return base::StringPrintf("unknown (%d)", static_cast<int>(state));
}

std::string DisplayModeToString(DisplayMode mode) {
  switch (mode) {
    case DisplayMode::NORMAL:
      return "normal";
    case DisplayMode::PRESENTATION:
      return "presentation";
  }
  NOTREACHED() << "Unhandled display mode " << static_cast<int>(mode);
  return base::StringPrintf("unknown (%d)", static_cast<int>(mode));
}

std::string ButtonStateToString(ButtonState state) {
  switch (state) {
    case ButtonState::UP:
      return "up";
    case ButtonState::DOWN:
      return "down";
    case ButtonState::REPEAT:
      return "repeat";
  }
  NOTREACHED() << "Unhandled button state " << static_cast<int>(state);
  return base::StringPrintf("unknown (%d)", static_cast<int>(state));
}

std::string ShutdownReasonToString(ShutdownReason reason) {
  // These are passed as SHUTDOWN_REASON arguments to an initctl command to
  // switch to runlevel 0 (shutdown) or 6 (reboot). Don't change these strings
  // without checking that other Upstart jobs aren't depending on them.
  switch (reason) {
    case ShutdownReason::USER_REQUEST:
      return "user-request";
    case ShutdownReason::STATE_TRANSITION:
      return "state-transition";
    case ShutdownReason::LOW_BATTERY:
      return "low-battery";
    case ShutdownReason::SUSPEND_FAILED:
      return "suspend-failed";
    case ShutdownReason::SHUTDOWN_FROM_SUSPEND:
      return "shutdown-from-suspend";
    case ShutdownReason::SYSTEM_UPDATE:
      return "system-update";
    case ShutdownReason::OTHER_REQUEST_TO_POWERD:
      return "other-request-to-powerd";
  }
  NOTREACHED() << "Unhandled shutdown reason " << static_cast<int>(reason);
  return "unknown";
}

std::string WifiRegDomainToString(WifiRegDomain domain) {
  switch (domain) {
    case WifiRegDomain::FCC:
      return "FCC";
    case WifiRegDomain::EU:
      return "EU";
    case WifiRegDomain::REST_OF_WORLD:
      return "Rest-of-World";
    case WifiRegDomain::NONE:
      return "None";
  }
  NOTREACHED() << "Unhandled WiFi reg domain " << static_cast<int>(domain);
  return "unknown";
}

}  // namespace power_manager
