// Copyright 2015 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.

#ifndef THERMALD_THERMAL_STATE_ENGINE_H_
#define THERMALD_THERMAL_STATE_ENGINE_H_

#include <map>
#include <string>

#include "base/macros.h"

#include "thermald/thermal_zone.h"

namespace thermald {

// Status of a thermal point.
struct ThermalPointStatus {
  // Current temperature at the thermal point.
  int temperature;

  // Flag indicating if the threshold has been cleared (= bottom threshold
  // reached).
  bool threshold_cleared;
};

// Determines the thermal state of the zone based on the current thermal state,
// the temperature of the thermal points of the zone and their thresholds.
class ThermalStateEngine {
 public:
  // Does not take ownership of the thermal zone. The caller must ensure that
  // the thermal zone is valid during the lifetime of the thermal state engine
  // object
  explicit ThermalStateEngine(const ThermalZone *zone);

  // Process a temperature update on a thermal point of the zone.
  bool ProcessTemperatureUpdate(const std::string &thermal_point,
                                int temperature);

  // The state object is guaranteed to be valid during the lifetime of the
  // thermal state engine.
  const ThermalState &current_state() { return *current_state_; }

 private:
  // Update the status of a thermal point after a temperature update.
  //
  // Mainly checks if the activation or bottom threshold have been reached
  // and updates the threshold_cleared flag accordingly.
  bool UpdateThermalPointStatus(const std::string &thermal_point,
                                int temperature);

  // Determine the thermal state of the zone.
  const ThermalState *DetermineThermalState();

  // Get the structure holding the status of a thermal point.
  //
  // If the structure doesn't exist yet it is created.
  ThermalPointStatus *GetThermalPointStatus(const std::string &thermal_point);

  // Helper function to initialize a newly entered thermal state.
  void InitNewThermalState();

  // Get the thresholds of a thermal point for a certain thermal state.
  bool GetThermalPointThresholds(const ThermalState &state,
                                 const std::string &thermal_point,
                                 ThermalPointThresholds *thresholds) const;

  const ThermalZone *zone_;

  // Map with the status of all thermal points of this zone
  // (point name => status).
  std::map<std::string, ThermalPointStatus> thermal_point_status_map_;

  // Current thermal state of the zone.
  const ThermalState *current_state_;

  DISALLOW_COPY_AND_ASSIGN(ThermalStateEngine);
};

}  // namespace thermald

#endif  // THERMALD_THERMAL_STATE_ENGINE_H_
