#ifndef OPENMW_TIMERAPI_HPP
#define OPENMW_TIMERAPI_HPP

#include <string>

#include <Script/FFI.hpp>
#include <unordered_map>

namespace mwmp
{

    class TimerAPI;

    class Timer: public FFI
    {
        friend class TimerAPI;

    public:

        Timer(ScriptFunc callback, long msec, const std::string& def, va_list args);
        ~Timer();

        void Tick(int timerId);

        bool IsEnded();
        void Stop();
        void Start();
        void Restart(int msec);
        const char *GetDefinition();
    private:
        double startTime, targetMsec;
        //std::string publ, arg_types;
        //Script *scr;
        bool isEnded;
        char *def;
    };

    class TimerAPI
    {
    public:
        static int CreateTimer(ScriptFunc callback, long msec, const std::string& def, va_list args);
        static void FreeTimer(int timerid);
        static void ResetTimer(int timerid, long msec);
        static void StartTimer(int timerid);
        static void StopTimer(int timerid);
        static bool IsTimerElapsed(int timerid);
        static int GetTimerId();
        static const char *GetDefinition(int timerid);

        static void Terminate();

        static void Tick();
    private:
        static std::unordered_map<int, Timer* > timers;
        static int pointer;
        static int lastTimerId;
    };
}

#endif //OPENMW_TIMERAPI_HPP