#pragma once

#include <chrono>

namespace managedStore
{

inline std::chrono::steady_clock::time_point clockNow()
{
    return std::chrono::steady_clock::now();
}

inline std::chrono::steady_clock::duration
    clockSince(const std::chrono::steady_clock::time_point& tp,
               const std::chrono::steady_clock::time_point& now = clockNow())
{
    return (now - tp);
}

inline int64_t clockSinceMilliseconds(
    const std::chrono::steady_clock::time_point& tp,
    const std::chrono::steady_clock::time_point& now = clockNow())
{
    auto since =
        std::chrono::duration_cast<std::chrono::milliseconds>(now - tp);
    return since.count();
}

inline int64_t clockSecondsSince(
    const std::chrono::steady_clock::time_point& tp,
    const std::chrono::steady_clock::time_point& now = clockNow())
{
    auto since = std::chrono::duration_cast<std::chrono::seconds>(now - tp);
    return since.count();
}

inline int64_t
    clockMillisecondsEpoch(const std::chrono::steady_clock::time_point& tp)
{
    auto since = std::chrono::duration_cast<std::chrono::milliseconds>(
        tp.time_since_epoch());
    return since.count();
}

inline int64_t
    clockSecondsEpoch(const std::chrono::steady_clock::time_point& tp)
{
    auto since =
        std::chrono::duration_cast<std::chrono::seconds>(tp.time_since_epoch());
    return since.count();
}

inline int64_t
    clockDurationMilliseconds(const std::chrono::steady_clock::duration& dt)
{
    auto since = std::chrono::duration_cast<std::chrono::milliseconds>(dt);
    return since.count();
}

}; // namespace managedStore
