#pragma once

#include <chrono>  // NOLINT

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
