#pragma once

#include "sdevent/event.hpp"
#include "sdevent/timer.hpp"

struct Loop;

namespace phosphor
{
namespace dbus
{
namespace monitoring
{

/** @class SDEvent
 *  @brief SDEventType access delegate implementation for sdevent.
 */
class SDEvent
{
  protected:
    /** @brief Share a single event loop amongst users. */
    static auto& getEvent()
    {
        static auto event = sdevent::event::newDefault();
        return event;
    }

  public:
    /** @brief Wrapper for sd_event_now. */
    static auto now()
    {
        return getEvent().now();
    }

    friend Loop;
};

/** @class SDEventTimer
 *  @brief TimerType access delegate implementation for sdevent.
 */
class SDEventTimer : public SDEvent
{
  public:
    SDEventTimer() = delete;
    SDEventTimer(const SDEventTimer&) = default;
    SDEventTimer(SDEventTimer&&) = default;
    SDEventTimer& operator=(const SDEventTimer&) = default;
    SDEventTimer& operator=(SDEventTimer&&) = default;
    ~SDEventTimer() = default;

    explicit SDEventTimer(
        const sdevent::event::timer::Timer::Callback& callback) :
        timer(getEvent(), callback)
    {
    }

    /** @brief Update a timer expiration. */
    void update(const std::chrono::steady_clock::time_point& expires)
    {
        timer.setTime(expires);
    }

    /** @brief Query timer state. */
    auto enabled()
    {
        return timer.enabled() != SD_EVENT_OFF;
    }

    /** @brief Enable a timer. */
    void enable()
    {
        timer.enable(SD_EVENT_ONESHOT);
    }

    /** @brief Disable a timer. */
    void disable()
    {
        timer.enable(SD_EVENT_OFF);
    }

  private:
    sdevent::event::timer::Timer timer;
};

} // namespace monitoring
} // namespace dbus
} // namespace phosphor
