#pragma once

#include <boost/asio.hpp>
#include <memory>
#include <unordered_set>
#include <vector>
#include <thread>
#include "WebsocketSession.h"
#include "Message.h"
#include "IoContextPool.h"

namespace asio = boost::asio;
using tcp = asio::ip::tcp;

class WebsocketServer {
public:
    explicit WebsocketServer(const tcp::endpoint& endpoint);
    ~WebsocketServer();

    // 启动服务器，开始接受连接
    void start();
    // 停止服务器并关闭所有连接
    void stop();
    // 向所有连接广播消息
    void broadcast(const Message& msg) const;
    // 当前连接数
    size_t connectionCount() const;
    bool isRunning() const;

private:
    // 异步接受连接
    void doAccept();
    // 配置新 socket 的选项
    static void setupSocketOptions(tcp::socket& socket);
    // 添加/移除连接会话
    void addSession(const std::shared_ptr<WebsocketSession>& session);
    void removeSession(const std::shared_ptr<WebsocketSession>& session);

private:
    // 双线程组：Boss线程组处理连接，Worker线程组处理IO
    IoContextPool worker_pool_;
    asio::io_context boss_context_;
    std::vector<std::thread> boss_threads_;

    // work_guard，保持 io_context 运行
    asio::executor_work_guard<asio::io_context::executor_type> boss_work_guard_;

    // Acceptor 监听新连接
    tcp::acceptor acceptor_;

    // 连接管理
    std::unordered_set<std::shared_ptr<WebsocketSession>> sessions_;    // 保存所有活跃连接，保证线程安全
    asio::strand<asio::io_context::executor_type> session_strand_;
    std::atomic<size_t> session_count_{0};  // 连接数计数，减少锁竞争

    // 性能优化参数
    static constexpr int kBacklogSize = 1024;           // 连接等待队列大小
    static constexpr int kRecvBufferSize = 64 * 1024;   // 接收缓冲区大小
    static constexpr int kSendBufferSize = 64 * 1024;   // 发送缓冲区大小
};