#pragma once

#include <wrl.h>

// Helper class for basic timing.
ref class BasicTimer sealed
{
public:
  // Initializes internal timer values.
  BasicTimer()
  {
    if (!QueryPerformanceFrequency(&m_frequency)) {
      throw ref new Platform::FailureException();
    }
    Reset();
  }

  // Reset the timer to initial values.
  void Reset()
  {
    Update();
    m_startTime = m_currentTime;
    m_total = 0.0f;
    m_delta = 1.0f / 60.0f;
  }

  // Update the timer's internal values.
  void Update()
  {
    if (!QueryPerformanceCounter(&m_currentTime)) {
      throw ref new Platform::FailureException();
    }

    m_total = static_cast<float>(
      static_cast<double>(m_currentTime.QuadPart - m_startTime.QuadPart) /
      static_cast<double>(m_frequency.QuadPart));

    if (m_lastTime.QuadPart == m_startTime.QuadPart) {
      // If the timer was just reset, report a time delta equivalent to 60Hz
      // frame time.
      m_delta = 1.0f / 60.0f;
    } else {
      m_delta = static_cast<float>(
        static_cast<double>(m_currentTime.QuadPart - m_lastTime.QuadPart) /
        static_cast<double>(m_frequency.QuadPart));
    }

    m_lastTime = m_currentTime;
  }

  // Duration in seconds between the last call to Reset() and the last call to
  // Update().
  property float Total
  {
    float get() { return m_total; }
  }

  // Duration in seconds between the previous two calls to Update().
  property float Delta
  {
    float get() { return m_delta; }
  }

private:
  LARGE_INTEGER m_frequency;
  LARGE_INTEGER m_currentTime;
  LARGE_INTEGER m_startTime;
  LARGE_INTEGER m_lastTime;
  float m_total;
  float m_delta;
};
