#pragma once

#include <boost/asio.hpp>
#include <vector>
#include <thread>
#include <memory>

namespace asio = boost::asio;

class IoContextPool {
public:
    explicit IoContextPool(size_t pool_size);
    ~IoContextPool();

    // 获取下一个 io_context（负载均衡轮询）
    asio::io_context& getIoContext();

    // 启动线程池
    void start();
    // 停止线程池
    void stop();
    // 线程池大小
    size_t size() const { return io_contexts_.size(); }

    // 在 worker 线程池中执行任务
    template <typename CompletionHandler>
    void post(CompletionHandler&& handler) {
        boost::asio::dispatch(getIoContext(), std::forward<CompletionHandler>(handler));
    }

private:
    std::vector<std::shared_ptr<asio::io_context>> io_contexts_;  // io_context 数组
    std::vector<std::unique_ptr<asio::executor_work_guard<asio::io_context::executor_type>>> work_guards_;  // 保持 io_context 运行
    std::vector<std::thread> worker_threads_;   // Worker 线程
    std::atomic<size_t> next_io_context_{0};    // 轮询索引
};
