#pragma once

// ------------------------------------------------------------------------------------------------
#include "Library/Chrono.hpp"

// ------------------------------------------------------------------------------------------------
namespace SqMod {

/* ------------------------------------------------------------------------------------------------
 *
*/
class Timer
{
    /* --------------------------------------------------------------------------------------------
     *
    */
    explicit Timer(int64_t t)
        : m_Timestamp(t)
    {
        /* ... */
    }

public:

    /* --------------------------------------------------------------------------------------------
     *
    */
    Timer();

    /* --------------------------------------------------------------------------------------------
     *
    */
    Timer(const Timer & o) = default;

    /* --------------------------------------------------------------------------------------------
     *
    */
    ~Timer() = default;

    /* --------------------------------------------------------------------------------------------
     *
    */
    Timer & operator = (const Timer o)
    {
        m_Timestamp = o.m_Timestamp;
        return *this;
    }

    /* --------------------------------------------------------------------------------------------
     * ...
    */
    SQMOD_NODISCARD int32_t Cmp(const Timer & b) const;

    /* --------------------------------------------------------------------------------------------
     * ...
    */
    SQMOD_NODISCARD String ToString() const;

    /* --------------------------------------------------------------------------------------------
     *
    */
    void Reset();

    /* --------------------------------------------------------------------------------------------
     *
    */
    Timestamp Restart();

    /* --------------------------------------------------------------------------------------------
     *
    */
    int64_t RestartRaw();

    /* --------------------------------------------------------------------------------------------
     *
    */
    SQMOD_NODISCARD Timestamp GetElapsedTime() const;

    /* --------------------------------------------------------------------------------------------
     *
    */
    SQMOD_NODISCARD int64_t GetElapsedTimeRaw() const;

private:

    // --------------------------------------------------------------------------------------------
    int64_t   m_Timestamp;
};

} // Namespace:: SqMod