#pragma once
#include <robotics/nexus_net_client.hpp>
/**
 * @brief nexus_net_network_v2 是一个实现了单例模式的网络管理类，负责客户端的启动、停止、事件绑定、远程调用和授权事件通知等功能。
 */
class nexus_net_network_v2 {
public:
	/**
	 * @brief 返回一个指向静态 nexus_net_network_v2 实例的指针，实现单例模式。
	 * @return 指向静态 nexus_net_network_v2 实例的指针。
	 */
	static nexus_net_network_v2* instance() {
		static nexus_net_network_v2 g_network;
		return &g_network;
	}
	/**
	 * @brief 销毁 network 对象并释放其相关资源。
	 */
	~nexus_net_network_v2() {
	}
	/**
	 * @brief 启动客户端。
	 */
	void start() {
		client_->start();
	}
	/**
	 * @brief 停止客户端的操作。
	 */
	void stop() {
		client_->stop();
	}
	/**
	 * @brief 将指定的函数和对象绑定到给定的键，并尝试订阅该键。
	 * @tparam _Fn 要绑定的函数对象的类型。
	 * @tparam _This 要绑定的对象实例的类型。
	 * @param key 要绑定和订阅的键名。
	 * @param fn 要绑定的函数对象。
	 * @param ths 与函数一起绑定的对象实例。
	 */
	template<typename _Fn, typename _This>
	void bind(std::string const& key, _Fn&& fn, _This&& ths) {
		if (!client_->subscribe(key, std::forward<_Fn>(fn), std::forward<_This>(ths))) {
			throw std::runtime_error("key不存在.");
		}
	}
	/**
	 * @brief
	 * @tparam _Ret
	 * @tparam ..._Args
	 * @param key
	 * @param ...args
	 * @return
	 */
	template<typename _Ret, typename ..._Args>
	_Ret invoke(std::string const& key, _Args&&...args) {
		return client_->publisher<_Ret>(key, std::forward<_Args>(args)...);
	}
	/**
	 * @brief
	 * @tparam _Ret
	 * @tparam ..._Args
	 * @param timeout
	 * @param key
	 * @param ...args
	 * @return
	 */
	template<typename _Ret, typename ..._Args>
	_Ret invoke(int timeout, std::string const& key, _Args&&...args) {
		return client_->publisher<_Ret>(timeout, key, std::forward<_Args>(args)...);
	}
	/**
	 * @brief 一个事件委托对象，用于在授权相关操作时通知监听者。
	 */
	v3::delegates<bool, std::string const&, std::string const&> authorized_event;
private:
	/**
	 * @brief 初始化网络客户端并绑定相关事件处理函数。
	 */
	nexus_net_network_v2() {
		client_ = v3::nexus_net_client::instance();
		client_->connect_event.bind(&nexus_net_network_v2::on_connect, this);
		client_->disconnect_event.bind(&nexus_net_network_v2::on_disconnect, this);
		client_->authorized_event.bind(&nexus_net_network_v2::on_authorized, this);
	}
private:
	/**
	 * @brief 处理分布式连接的回调，根据连接状态记录日志。
	 * @param status 表示连接是否成功的布尔值。为 true 表示连接成功，为 false 表示连接失败。
	 */
	void on_connect(bool status) {
		if (status) {
			LOG_INFO << "分布式连接成功v2.";
		}
		else {
			LOG_ERROR << "分布式连接失败v2.";
		}
	}
	/**
	 * @brief 处理分布式连接断开的事件并记录警告日志。
	 */
	void on_disconnect() {
		LOG_INFO << "分布式连接断开v2.";
	}
	/**
	 * @brief 处理授权事件的回调函数。
	 * @param status 表示授权状态的布尔值。
	 * @param parent_code 父级代码的字符串引用。
	 * @param parent_name 父级名称的字符串引用。
	 */
	void on_authorized(bool status, std::string const& parent_code, std::string const& parent_name) {
		authorized_event(status, parent_code, parent_name);
	}
private:
	/**
	 * @brief 声明并初始化一个指向 v3::nexus_net_client 类型的指针变量 client_，初始值为 nullptr。
	 */
	v3::nexus_net_client* client_ = nullptr;
};