#pragma once
//robotics
#include <robotics/thread_pool.hpp>
#include <robotics/utils.hpp>
//local
#include "../xml/xml_context.hpp"
#include "nexus_net_network_v1.hpp"
#include "nexus_net_network_v2.hpp"
#include "http_network.hpp"

/**
 * @brief network 类用于管理和协调多种网络组件，支持网络服务的启动、停止、云端同步、授权处理及事件分发等功能。该类实现了单例模式，确保全局仅有一个 network 实例。
 */
class network : public v3::thread_pool<network> {
public:
	/**
	 * @brief 返回 network 类的单例实例指针。
	 * @return 指向唯一 network 实例的指针。
	 */
	static network* instance() {
		static network g_network;
		return &g_network;
	}
	/**
	 * @brief 析构函数，用于销毁 network 对象并在销毁前调用 stop() 方法。
	 */
	~network() {
		stop();
	}
	/**
	 * @brief 启动所有网络组件。
	 */
	void start() {
		nexus_net_v1_->start();
		nexus_net_v2_->start();
	}
	/**
	 * @brief 停止所有网络服务。
	 */
	void stop() {
		nexus_net_v1_->stop();
		nexus_net_v2_->stop();
	}
	/**
	 * @brief 同步获取告警配置信息。
	 * @return 返回一个包含所有告警配置信息的 std::vector<web_alarm_config_info> 对象。如果没有返回数据，则抛出 std::runtime_error 异常。
	 */
	std::vector<web_alarm_config_info> sync_alarm_request() {
		auto response = http_network_->alarm_request();
		LOG_INFO << "msg:" << response.msg << " code:" << response.code << " count:" << response.count;
		if (response.data.empty()) {
			throw std::runtime_error("没有返回数据.");
		}
		return response.data;
	}
	/**
	 * @brief 同步请求品牌配置信息，并返回结果列表。
	 * @return 包含所有品牌配置信息的 std::vector<web_brand_config_info> 对象。如果没有返回数据，则抛出 std::runtime_error 异常。
	 */
	std::vector<web_brand_config_info> sync_brand_request() {
		auto response = http_network_->brand_request();
		LOG_INFO << "msg:" << response.msg << " code:" << response.code << " count:" << response.count;
		if (response.data.empty()) {
			throw std::runtime_error("没有返回数据.");
		}
		return response.data;
	}
	/**
	 * @brief 同步请求设备配置信息，并返回配置信息列表。
	 * @return 包含所有设备配置信息的 std::vector<web_device_config_info>。如果未返回数据，则抛出 std::runtime_error 异常。
	 */
	std::vector<web_device_config_info> sync_device_request() {
		auto response = http_network_->device_request();
		LOG_INFO << "msg:" << response.msg << " code:" << response.code << " count:" << response.count;
		if (response.data.empty()) {
			throw std::runtime_error("没有返回数据.");
		}
		return response.data;
	}
	/**
	 * @brief 同步获取配置信息请求，并返回配置信息列表。
	 * @return 包含所有配置信息的 std::vector<web_fitting_config_info>。如果没有返回数据，则抛出 std::runtime_error 异常。
	 */
	std::vector<web_fitting_config_info> sync_fitting_request() {
		auto response = http_network_->fitting_request();
		LOG_INFO << "msg:" << response.msg << " code:" << response.code << " count:" << response.count;
		if (response.data.empty()) {
			throw std::runtime_error("没有返回数据.");
		}
		return response.data;
	}
	/**
	 * @brief 同步发送通用请求并返回结果数据列表。
	 * @param key 用于请求的键值。
	 * @return 包含请求结果的 web_general_config_info 对象的 std::vector。如果没有返回数据，则抛出异常。
	 */
	std::vector<web_general_config_info> sync_general_request(int key) {
		auto response = http_network_->general_request(key);
		LOG_INFO << "msg:" << response.msg << " code:" << response.code << " count:" << response.count;
		if (response.data.empty()) {
			throw std::runtime_error("没有返回数据.");
		}
		return response.data;
	}
	/**
	 * @brief 同步获取模型配置信息列表。
	 * @return 返回一个包含所有模型配置信息的 std::vector<web_spec_config_info>。如果没有返回数据，则抛出 std::runtime_error 异常。
	 */
	std::vector<web_spec_config_info> sync_spec_request() {
		auto response = http_network_->spec_request();
		LOG_INFO << "msg:" << response.msg << " code:" << response.code << " count:" << response.count;
		if (response.data.empty()) {
			throw std::runtime_error("没有返回数据.");
		}
		return response.data;
	}
	/**
	 * @brief 同步请求并返回关卡配置信息列表。
	 * @return 一个包含所有关卡配置信息的 std::vector<web_level_config_info> 对象。如果没有返回数据，则抛出 std::runtime_error 异常。
	 */
	std::vector<web_level_config_info> sync_level_request() {
		auto response = http_network_->level_request();
		LOG_INFO << "msg:" << response.msg << " code:" << response.code << " count:" << response.count;
		if (response.data.empty()) {
			throw std::runtime_error("没有返回数据.");
		}
		return response.data;
	}
	/**
	 * @brief 发送同步告警请求。
	 * @param value 包含同步告警信息的常量引用。
	 * @return 返回一个 web_message_info 对象，表示请求的结果。
	 */
	web_message_info update_alarm_request(web_sync_alarm_info const& value) {
		http_network_->update_alarm_request(value);
	}
	/**
	 * @brief 用于处理云报警事件的委托对象。
	 */
	v3::delegates<std::vector<web_alarm_config_info>const&>		cloud_alarm_event;
	/**
	 * @brief 用于处理云品牌事件的委托对象。
	 */
	v3::delegates<std::vector<web_brand_config_info> const&>	cloud_brand_event;
	/**
	 * @brief 用于处理云设备事件的委托对象。
	 */
	v3::delegates<std::vector<web_device_config_info> const&>	cloud_device_event;
	/**
	 * @brief 云拟合事件的委托对象，用于处理 web_fitting_config_info 配置信息的回调。
	 */
	v3::delegates<std::vector<web_fitting_config_info>const&>	cloud_fitting_event;
	/**
	 * @brief 用于处理 cloud_general_event 事件的委托对象，传递常量引用的 web_general_config_info 向量。
	 */
	v3::delegates<std::vector<web_general_config_info> const&>	cloud_general_event;
	/**
	 * @brief 用于处理云模型事件的委托对象。
	 */
	v3::delegates<std::vector<web_spec_config_info> const&>		cloud_spec_event;
	/**
	 * @brief 云等级事件的委托对象，用于处理与 web_level_config_info 列表相关的事件。
	 */
	v3::delegates<std::vector<web_level_config_info> const&>	cloud_level_event;
private:
	/**
	 * @brief network 构造函数，初始化网络相关组件并绑定事件处理函数。
	 */
	network() :
		v3::thread_pool<network>() {
		http_network_ = http_network::instance();
		nexus_net_v1_ = nexus_net_network_v1::instance();
		nexus_net_v2_ = nexus_net_network_v2::instance();

		nexus_net_v1_->authorized_event.bind(&network::on_authorized_v1, this);
		nexus_net_v2_->authorized_event.bind(&network::on_authorized_v2, this);

		nexus_net_v2_->bind("cloud_alarm", &network::on_cloud_alarm_response, this);
		nexus_net_v2_->bind("cloud_brand", &network::on_cloud_brand_response, this);
		nexus_net_v2_->bind("cloud_device", &network::on_cloud_device_response, this);
		nexus_net_v2_->bind("cloud_fitting", &network::on_cloud_fitting_response, this);
		nexus_net_v2_->bind("cloud_general", &network::on_cloud_general_response, this);
		nexus_net_v2_->bind("cloud_spec", &network::on_cloud_spec_response, this);
		nexus_net_v2_->bind("cloud_level", &network::on_cloud_level_response, this);
	}
private:
	/**
	 * @brief 处理云端告警的响应数据。
	 * @param data 包含云端告警响应信息的 JSON 字符串。
	 */
	void on_cloud_alarm_response(std::string const& data) {
		REGISTER_ASYNC_FUNC(on_cloud_alarm_response, data);
		try {
			web_response_info<web_alarm_config_info> value;
			v3::json_convert::deserialize(data, value);
			cloud_alarm_event(value.data);
		}
		catch (std::exception const& ec) {
			LOG_ERROR << ec;
		}
	}
	/**
	 * @brief 处理云品牌响应数据并触发相关事件。
	 * @param data 包含云品牌配置信息的 JSON 字符串。
	 */
	void on_cloud_brand_response(std::string const& data) {
		REGISTER_ASYNC_FUNC(on_cloud_brand_response, data);
		try {
			web_response_info<web_brand_config_info> value;
			v3::json_convert::deserialize(data, value);
			cloud_brand_event(value.data);
		}
		catch (std::exception const& ec) {
			LOG_ERROR << ec;
		}
	}
	/**
	 * @brief 处理来自云设备的响应数据并触发相应事件。
	 * @param data 包含云设备响应内容的字符串。
	 */
	void on_cloud_device_response(std::string const& data) {
		REGISTER_ASYNC_FUNC(on_cloud_device_response, data);
		try {
			web_response_info<web_device_config_info> value;
			v3::json_convert::deserialize(data, value);
			cloud_device_event(value.data);
		}
		catch (std::exception const& ec) {
			LOG_ERROR << ec;
		}
	}
	/**
	 * @brief 处理云拟合响应数据并触发相关事件。
	 * @param data 包含云拟合响应信息的 JSON 字符串。
	 */
	void on_cloud_fitting_response(std::string const& data) {
		REGISTER_ASYNC_FUNC(on_cloud_fitting_response, data);
		try {
			web_response_info<web_fitting_config_info> value;
			v3::json_convert::deserialize(data, value);
			cloud_fitting_event(value.data);
		}
		catch (std::exception const& ec) {
			LOG_ERROR << ec;
		}
	}
	/**
	 * @brief 处理云端通用响应数据并触发相关事件。
	 * @param data 包含云端通用响应信息的 JSON 字符串。
	 */
	void on_cloud_general_response(std::string const& data) {
		REGISTER_ASYNC_FUNC(on_cloud_general_response, data);
		try {
			web_response_info<web_general_config_info> value;
			v3::json_convert::deserialize(data, value);
			cloud_general_event(value.data);
		}
		catch (std::exception const& ec) {
			LOG_ERROR << ec;
		}
	}
	/**
	 * @brief 处理云模型的响应数据并触发相关事件。
	 * @param data 包含云模型响应内容的字符串。
	 */
	void on_cloud_spec_response(std::string const& data) {
		REGISTER_ASYNC_FUNC(on_cloud_spec_response, data);
		try {
			web_response_info<web_spec_config_info> value;
			v3::json_convert::deserialize(data, value);
			cloud_spec_event(value.data);
		}
		catch (std::exception const& ec) {
			LOG_ERROR << ec;
		}
	}
	/**
	 * @brief 处理云端等级响应数据并触发相关事件。
	 * @param data 包含云端等级配置信息的 JSON 字符串。
	 */
	void on_cloud_level_response(std::string const& data) {
		REGISTER_ASYNC_FUNC(on_cloud_level_response, data);
		try {
			web_response_info<web_level_config_info> value;
			v3::json_convert::deserialize(data, value);
			cloud_level_event(value.data);
		}
		catch (std::exception const& ec) {
			LOG_ERROR << ec;
		}
	}
private:
	/**
	 * @brief 根据授权状态处理设备ID的设置。
	 * @param status 表示是否已授权的布尔值。
	 * @param parent_code 父设备的代码，用于设置设备ID。
	 * @param parent_name 父设备的名称。
	 */
	void on_authorized_v2(bool status, std::string const& parent_code, std::string const& parent_name) {
		if (status) {
			http_network_->set_device_id(parent_code);
			LOG_INFO << "分布式授权成功v2.";
		}
		else {
			LOG_ERROR << "分布式授权失败v2.";
		}
	}
	/**
	 * @brief 根据授权状态记录分布式授权v1的日志信息。
	 * @param status 授权状态。如果为 true，表示授权成功；如果为 false，表示授权失败。
	 */
	void on_authorized_v1(bool status) {
		if (status) {
			LOG_INFO << "分布式授权成功v1.";
		}
		else {
			LOG_ERROR << "分布式授权失败v1.";
		}
	}
private:
	http_network*			http_network_ = nullptr;
	nexus_net_network_v1*	nexus_net_v1_ = nullptr;
	nexus_net_network_v2*	nexus_net_v2_ = nullptr;
};