#pragma once
#include <functional>
#include <org/open_power/Sensor/Aggregation/History/Maximum/server.hpp>

namespace phosphor
{
namespace power
{
namespace history
{

template <typename T>
using ServerObject = typename sdbusplus::server::object::object<T>;

using MaximumInterface =
    sdbusplus::org::open_power::Sensor::Aggregation::History::server::Maximum;

/**
 * @class Maximum
 *
 * Implements Sensor.Aggregation.History.Maximum
 *
 * This includes a property that is an array of timestamp/maximum tuples
 * and a property to specify the scale.
 */
class Maximum : public ServerObject<MaximumInterface>
{
  public:
    static constexpr auto name = "maximum";

    Maximum() = delete;
    Maximum(const Maximum&) = delete;
    Maximum& operator=(const Maximum&) = delete;
    Maximum(Maximum&&) = delete;
    Maximum& operator=(Maximum&&) = delete;
    ~Maximum() = default;

    /**
     * @brief Constructor
     *
     * @param[in] bus - D-Bus object
     * @param[in] objectPath - the D-Bus object path
     */
    Maximum(sdbusplus::bus::bus& bus, const std::string& objectPath) :
        ServerObject<MaximumInterface>(bus, objectPath.c_str())
    {
        unit(Maximum::Unit::Watts);
        scale(0);
    }
};

} // namespace history
} // namespace power
} // namespace phosphor
