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

namespace witherspoon
{
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);
        }
};


}
}
}
