#pragma once
#include <boost/asio.hpp>
#include <functional>
#include <vector>
#include <thread>
#include <memory>
#include <queue>


namespace ZL {

    class TaskManager {
    private:
        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;

    public:
        //TaskManager(size_t threadCount = std::thread::hardware_concurrency());
        TaskManager(size_t threadCount = 2);

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

        // Graceful shutdown
        ~TaskManager();

        boost::asio::io_context& getIOContext()
        {
			return ioContext;
        }
    };


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

    public:
        void EnqueueMainThreadTask(std::function<void()> task);

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

} // namespace ZL