#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;
};
