#pragma once

#ifndef EMSCRIPTEN
#include <boost/asio.hpp>
#include <thread>
#endif

#include <functional>
#include <vector>
#include <memory>
#include <queue>


namespace ZL {

    class TaskManager {
    private:
#ifndef EMSCRIPTEN
        boost::asio::io_context ioContext;
        std::unique_ptr<boost::asio::executor_work_guard<boost::asio::io_context::executor_type>> workGuard;
        std::vector<std::thread> workers;
#endif
    public:
        TaskManager(size_t threadCount = 2);

        // ћетод дл¤ добавлени¤ фоновой задачи
        void EnqueueBackgroundTask(std::function<void()> task);

        // Graceful shutdown
        ~TaskManager();
        
#ifndef EMSCRIPTEN
        boost::asio::io_context& getIOContext()
        {
			return ioContext;
        }
#endif
    };


    class MainThreadHandler
    {
    private:
        std::queue<std::function<void()>> mainThreadTasks;

#ifndef EMSCRIPTEN
        std::mutex mainThreadMutex;
#endif
    public:
        void EnqueueMainThreadTask(std::function<void()> task);

        // ¬ыполнение задач по одной (или пачкой) за кадр
        void processMainThreadTasks();
    };

} // namespace ZL