#include "timer.h"

#include <loguru.hpp>

#include <iostream>

Timer::Timer() {
  Reset();
}

long long Timer::ElapsedMicroseconds() const {
  std::chrono::time_point<Clock> end = Clock::now();
  return std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
}

long long Timer::ElapsedMicrosecondsAndReset() {
  std::chrono::time_point<Clock> end = Clock::now();
  long long microseconds = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();
  Reset();
  return microseconds;
}

void Timer::Reset() {
  start = Clock::now();
}

void Timer::ResetAndPrint(const std::string& message) {
  std::chrono::time_point<Clock> end = Clock::now();
  long long elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start).count();

  long long milliseconds = elapsed / 1000;
  long long remaining = elapsed - milliseconds;

  LOG_S(INFO) << message << " took " << milliseconds << "." << remaining << "ms";
  Reset();
}