// Copyright 2019 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/battery_percentage_converter.h"

#include <algorithm>

#include "power_manager/common/power_constants.h"
#include "power_manager/common/prefs.h"
#include "power_manager/common/util.h"

namespace power_manager {

// static
std::unique_ptr<BatteryPercentageConverter>
BatteryPercentageConverter::CreateFromPrefs(PrefsInterface* prefs) {
  DCHECK(prefs);

  double low_battery_shutdown_percent = 0.0;
  prefs->GetDouble(power_manager::kLowBatteryShutdownPercentPref,
                   &low_battery_shutdown_percent);
  double full_factor = 1.0;
  prefs->GetDouble(power_manager::kPowerSupplyFullFactorPref, &full_factor);

  return std::make_unique<BatteryPercentageConverter>(
      low_battery_shutdown_percent, full_factor);
}

BatteryPercentageConverter::BatteryPercentageConverter(
    double low_battery_shutdown_percent, double full_factor)
    : low_battery_shutdown_percent_(low_battery_shutdown_percent),
      full_factor_(std::min(std::max(kEpsilon, full_factor), 1.0)) {}

BatteryPercentageConverter::~BatteryPercentageConverter() = default;

double BatteryPercentageConverter::ConvertActualToDisplay(
    double actual_percentage) const {
  return util::ClampPercent(
      100.0 * (actual_percentage - low_battery_shutdown_percent_) /
      (100.0 * full_factor_ - low_battery_shutdown_percent_));
}

double BatteryPercentageConverter::ConvertDisplayToActual(
    double display_percentage) const {
  return util::ClampPercent(
      full_factor_ * display_percentage + low_battery_shutdown_percent_ -
      display_percentage * low_battery_shutdown_percent_ / 100.0);
}

}  // namespace power_manager
