#pragma once
#include "../xml/xml_update.hpp"
#include "../network/network.hpp"

class core {
public:
	/**
	 * @brief 初始化 core 对象，设置网络和定时器事件绑定，并启动定时器。
	 */
	core() {
		network_ = network::instance();

		network_->cloud_after_event.bind(&core::on_cloud_after_response, this);
		network_->cloud_general_event.bind(&core::on_cloud_general_response, this);
		timer_.timeout_event.bind(&core::on_timeout, this);

		g_message_bus.bind("cloud_after_request", &core::on_sync_after_request, this);
		g_message_bus.bind("cloud_general_request", &core::on_sync_general_request, this);

		timer_.start(1000 * 60);
	}
	/**
	 * @brief 析构 core 类的对象，释放相关资源。
	 */
	~core() {
	}
	/**
	 * @brief 启动网络组件。
	 */
	void start() {
		network_->start();
	}
	/**
	 * @brief 停止网络操作。
	 */
	void stop() {
		network_->stop();
	}
private:
	/**
	 * @brief 在请求完成后进行同步操作，并处理云端响应。
	 */
	void on_sync_after_request() {
		auto value = network_->sync_after_request();
		on_cloud_after_response(value);
	}
	/**
	 * @brief 根据给定的键发起同步请求，并处理云端返回的结果。
	 * @param key 用于同步请求的键值。
	 */
	void on_sync_general_request(int key) {
		auto values = network_->sync_general_request(key);
		on_cloud_general_response(values);
	}
private:
	/**
	 * @brief 在收到云端响应后，使用提供的配置信息更新本地 XML 配置。
	 * @param value 包含云端返回配置信息的 web_after_config_info 常量引用。
	 */
	void on_cloud_after_response(web_after_config_info const& value) {
		xml_update::update(value);
	}
	/**
	 * @brief 处理云端通用响应并更新本地配置。
	 * @param values 包含 web_general_config_info 对象的常量引用向量，表示从云端接收到的配置信息。
	 */
	void on_cloud_general_response(std::vector<web_general_config_info> const&values) {
		xml_update::update(values);
	}
private:
	/**
	 * @brief 定时器回调
	 */
	void on_timeout() {
		std::shared_ptr<web_after_config_info> value = xml_context::from<web_after_config_info>().
			where([](auto it)
				{
					return it->enable;
				}).
			first();

		if (value) {
			try {
				auto base64 = v3::utils::base64_decode(std::vector<std::uint8_t>(value->value.begin(), value->value.end()));
				if (base64.empty()) {
					throw std::runtime_error("信息解码失败！");
				}
				auto json = v3::utils::aes_decode(base64, "AB62iLCraiKiPu5awUPqQCEsDJ6JchCO");
				auto info = v3::json_convert::deserialize<web_cloud_after_info>(std::string(json.begin(), json.end()));
				if (info.status) {
					//判断授权是否到期
					if (info.time < v3::datetime::current_datetime()) {
						info.is_show_msg = true;
						info.status = false;
						info.msg = "设备异常，请及时联系设备厂商售后!";
					}
					else if (!info.is_show_msg) {
						auto mac_list = v3::utils::mac();
						if (std::find(mac_list.begin(), mac_list.end(), info.mac) == mac_list.end()) {
							info.is_show_msg = true;
							info.msg = "MAC错误，请及时联系设备厂商售后!";
						}
					}
				}
				network_->sync_after(info);
			}
			catch (std::exception const& ec) {
				LOG_ERROR << ec;
			}
		}
		else {
			web_cloud_after_info info;
			info.is_show_msg = true;
			info.msg = "请先在配置中心进行设备售后！";
			info.status = false;
			network_->sync_after(info);
		}
	}
private:
	v3::timer timer_;
	network*  network_ = nullptr;
};