// 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/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 kSetWifiTransmitPowerForTabletModePref[] =
    "set_wifi_transmit_power_for_tablet_mode";
const char kSetWifiTransmitPowerForProximityPref[] =
    "set_wifi_transmit_power_for_proximity";
const char kSetCellularTransmitPowerForTabletModePref[] =
    "set_cellular_transmit_power_for_tablet_mode";
const char kSetCellularTransmitPowerForProximityPref[] =
    "set_cellular_transmit_power_for_proximity";
const char kSetCellularTransmitPowerDprGpioPref[] =
    "set_cellular_transmit_power_dpr_gpio";
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";

// 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";

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 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
