#pragma once

#include <systemd/sd-event.h>

#include <chrono>
#include <functional>

namespace phosphor
{
namespace network
{

/** @class Timer
 *  @brief Usage would be,instantiate the timer with the call back
 *         and start the timer for the given time.
 */
class Timer
{
  public:
    /** @brief Only need the default Timer */
    Timer() = delete;
    Timer(const Timer&) = delete;
    Timer& operator=(const Timer&) = delete;
    Timer(Timer&&) = delete;
    Timer& operator=(Timer&&) = delete;

    /** @brief Constructs timer object
     *
     *  @param[in] funcCallBack - optional function callback for timer
     *                            expirations
     */
    Timer(std::function<void()> userCallBack = nullptr) :
        userCallBack(userCallBack)
    {
        // Initialize the timer
        initialize();
    }

    ~Timer()
    {
        if (eventSource)
        {
            eventSource = sd_event_source_unref(eventSource);
        }
        if (timeEvent)
        {
            timeEvent = sd_event_unref(timeEvent);
        }
    }

    inline auto isExpired() const
    {
        return expired;
    }

    /** @brief Starts the timer with specified expiration value.
     *  input is an offset from the current steady_clock
     */
    int startTimer(std::chrono::microseconds usec);

    /** @brief Enables / disables the timer */
    int setTimer(int action);

  private:
    /** @brief the sd_event structure */
    sd_event* timeEvent = nullptr;

    /** @brief Source of events */
    sd_event_source* eventSource = nullptr;

    bool expired = true;

    /** @brief Initializes the timer object with infinite
     *         expiration time and sets up the callback handler
     *
     *  @return None.
     *
     *  @error std::runtime exception thrown
     */
    void initialize();

    /** @brief Callback function when timer goes off
     *
     *  @param[in] eventSource - Source of the event
     *  @param[in] usec        - time in micro seconds
     *  @param[in] userData    - User data pointer
     *
     */
    static int timeoutHandler(sd_event_source* eventSource, uint64_t usec,
                              void* userData);

    /** @brief Gets the current time from steady clock */
    static std::chrono::microseconds getTime();

    /** @brief Optional function to call on timer expiration */
    std::function<void()> userCallBack;
};

} // namespace network
} // namespace phosphor
