#ifndef OPENMW_MWLUA_WORKER_H
#define OPENMW_MWLUA_WORKER_H

#include <osg/Timer>
#include <osg/ref_ptr>

#include <condition_variable>
#include <mutex>
#include <optional>
#include <thread>

namespace osg
{
    class Stats;
}

namespace MWLua
{
    class LuaManager;

    class Worker
    {
    public:
        explicit Worker(LuaManager& manager);

        ~Worker();

        void allowUpdate(osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats);

        void finishUpdate(osg::Timer_t frameStart, unsigned int frameNumber, osg::Stats& stats);

        void join();

    private:
        struct UpdateRequest
        {
            osg::Timer_t mFrameStart;
            unsigned mFrameNumber;
            osg::ref_ptr<osg::Stats> mStats;
        };

        void update(osg::Timer_t frameStart, unsigned frameNumber, osg::Stats& stats);

        void run() noexcept;

        LuaManager& mManager;
        std::mutex mMutex;
        std::condition_variable mCV;
        std::optional<UpdateRequest> mUpdateRequest;
        bool mJoinRequest = false;
        std::optional<std::thread> mThread;
    };
}

#endif // OPENMW_MWLUA_LUAWORKER_H