#pragma once
#include <asio2/asio2.hpp>
#include <robotics/logger.hpp>
#include "../xml/xml_context.hpp"

#define LATTICE_EVENT		"latticeEvent"
#define ALARM_EVENT			"alarmEvent"
#define DEVICE_STATUS_EVENT "deviceStartStopEvent"
#define LIST_SEND_EVENT		"listSendEvent"
#define LINE_SPEED_EVENT	"lineSpeedEvent"
#define GK_DISABLE_EVENT	"gkDisableEvent"
#define CAR_DISABLE_EVENT	"carDisableEvent"
#define SCAN_EVENT			"scanEvent"
#define AFTER_EVENT			"authorizeEvent"
/**
 * @brief rpc_network 类用于管理和操作远程过程调用（RPC）网络，包括启动、停止服务器、异步调用方法以及处理连接事件等功能。该类采用单例模式，确保全局只有一个实例。
 */
class rpc_network {
public:
	/**
	 * @brief 返回 rpc_network 的单例实例指针。
	 * @return 指向唯一 rpc_network 实例的指针。
	 */
	static rpc_network* instance() {
		static rpc_network g_network;
		return &g_network;
	}
	/**
	 * @brief 销毁 rpc_network 对象并释放相关资源。
	 */
	~rpc_network() {
	}
	/**
	 * @brief 启动 RPC 服务器并监听指定端口。
	 */
	void start() {
		std::shared_ptr<web_general_config_info> config = xml_context::from<web_general_config_info>().where([](auto it) { return it->enable && it->key == 2; }).first();
		if (config) {
			rpc_server_.start("0.0.0.0", std::atoi(config->value.c_str()));
		}
	}
	/**
	 * @brief 停止当前操作，不执行任何操作。
	 */
	void stop() {
		rpc_server_.stop();
	}
	/**
	 * @brief 调用异步RPC方法，并根据参数传递状态和消息。
	 * @param status 表示当前操作状态的布尔值。
	 * @param is_show_msg 指示是否显示消息的布尔值。
	 * @param msg 要传递的消息内容（UTF-8编码的字符串）。
	 */
	void invoke(bool status, bool is_show_msg, std::string const&msg) {
		rpc_server_.async_call([]() {}, AFTER_EVENT, status, is_show_msg, v3::utils::utf8_to_gbk(msg));
	}
private:
	/**
	 * @brief 初始化或配置 RPC 网络功能。
	 */
	rpc_network() {
		rpc_server_.bind_connect(&rpc_network::on_connect, this);
		rpc_server_.bind_disconnect(&rpc_network::on_disconnect, this);
		rpc_server_.bind(LATTICE_EVENT, [](std::string, std::string, int, int) {});
		rpc_server_.bind(ALARM_EVENT, [](int, int, int) {});
		rpc_server_.bind(DEVICE_STATUS_EVENT, [](int, std::string) {});
		rpc_server_.bind(LIST_SEND_EVENT, [](std::pair<int, std::vector<std::string>>) {});
		rpc_server_.bind(LINE_SPEED_EVENT, [](double) {});
		rpc_server_.bind(GK_DISABLE_EVENT, [](int) {});
		rpc_server_.bind(CAR_DISABLE_EVENT, [](int) {});
		rpc_server_.bind(SCAN_EVENT, [](std::string) {});
	}
private:
	/**
	 * @brief 当会话连接成功时调用的回调函数，记录远程主机的IP地址和端口号。
	 * @param ptr 指向已连接的 rpc_session 的智能指针引用。
	 */
	void on_connect(std::shared_ptr<asio2::rpc_session> &ptr) {
		LOG_INFO << "售后服务RPC连接成功.";
	}
	/**
	 * @brief 当连接断开时调用的回调函数，记录断开连接的远程地址和端口。
	 * @param ptr 指向已断开连接的 rpc_session 会话的智能指针。
	 */
	void on_disconnect(std::shared_ptr<asio2::rpc_session>& ptr) {
		LOG_INFO << "售后服务RPC连接断开.";
	}
private:
	/**
	 * @brief 一个用于处理远程过程调用（RPC）的服务器对象。
	 */
	asio2::rpc_server rpc_server_;
};