#include "utils/delta_timer.hpp"

DeltaTimer::DeltaTimer() noexcept
    : last_counter_(SDL_GetPerformanceCounter()),
      perf_freq_(static_cast<double>(SDL_GetPerformanceFrequency())),
      time_scale_(1.0F) {
}

auto DeltaTimer::tick() noexcept -> float {
    const Uint64 NOW = SDL_GetPerformanceCounter();
    const Uint64 DIFF = (NOW > last_counter_) ? (NOW - last_counter_) : 0;
    last_counter_ = NOW;
    const double SECONDS = static_cast<double>(DIFF) / perf_freq_;
    return static_cast<float>(SECONDS * static_cast<double>(time_scale_));
}

auto DeltaTimer::peek() const noexcept -> float {
    const Uint64 NOW = SDL_GetPerformanceCounter();
    const Uint64 DIFF = (NOW > last_counter_) ? (NOW - last_counter_) : 0;
    const double SECONDS = static_cast<double>(DIFF) / perf_freq_;
    return static_cast<float>(SECONDS * static_cast<double>(time_scale_));
}

void DeltaTimer::reset(Uint64 counter) noexcept {
    if (counter == 0) {
        last_counter_ = SDL_GetPerformanceCounter();
    } else {
        last_counter_ = counter;
    }
}

void DeltaTimer::setTimeScale(float scale) noexcept {
    time_scale_ = std::max(scale, 0.0F);
}

auto DeltaTimer::getTimeScale() const noexcept -> float {
    return time_scale_;
}
