#pragma once
//robotics
#include <robotics/mvc.hpp>
#include <robotics/logger.hpp>
#include <robotics/message_bus.hpp>
//local
#include "../xml/xml_context.hpp"
#include "../response/response.hpp"
#include "../models/web_message_info.h"
#include "../models/web_response_info.h"
#include "../models/web_alarm_config_info.h"

using namespace robotics;
extern v3::message_bus  g_message_bus;
using WebResponse		= robotics::v3::mvc::web_result_response;
using HttpContext		= robotics::v3::mvc::http_context::curr;
using JumpResponse		= robotics::v3::mvc::jump_response;
using TextResponse		= robotics::v3::mvc::text_response;
using JsonResponse		= robotics::v3::mvc::json_response;
using StreamResponse	= robotics::v3::mvc::stream_response;
using DownloadResponse	= robotics::v3::mvc::download_response;
using HtmlResponse		= robotics::v3::mvc::html_response;
using View				= robotics::v3::mvc::view;

/* ************************************************
* 作者:Lenovo
* 时间:2024/5/24 11:04:02
* 机器名:DESKTOP-4I13MDL
* 控制器名:alarm
* *************************************************/
class alarm {
public:
	alarm() {}
	/**
	 * @brief 处理对“alarm/index”路径的请求，并返回对应的视图页面。
	 * @return 返回一个WebResponse对象，表示渲染的“alarm/index.html”视图页面。
	 */
	[[Route("alarm/index")]]
	[[FileMapping("alarm/index.html")]]
	WebResponse index() {
		auto brand = xml_context::from<web_brand_config_info>().
			where([](auto it)
				{
					return it->enable;
				}).
			value();
		auto spec = xml_context::from<web_spec_config_info>().
			where([](auto it)
				{
					return it->enable;
				}).
			value();
		auto level = xml_context::from<web_level_config_info>().
			where([](auto it)
				{
					return it->enable;
				}).
			value();

		return View(brand, spec, level);
	}
	/**
	 * @brief 加载报警配置数据，支持分页和条件筛选。
	 * @param page 要加载的页码，从1开始。
	 * @param limit 每页返回的数据条数。
	 * @param number 用于筛选的报警编号（字符串，若为空则不筛选）。
	 * @param enable 用于筛选的启用状态（字符串，'true'或'false'，若为空则不筛选）。
	 * @return 包含报警配置信息的WebResponse对象，数据已按条件筛选和分页。
	 */
	[[Route("alarm/load")]]
	WebResponse load(int page, int limit,
		std::string number,
		std::string enable) {
		web_response_info<web_alarm_config_info> result;
		result.data = xml_context::from<web_alarm_config_info>().
			size(result.count).
			where([number, enable](auto it)
				{
					return (number.empty() || std::atoi(number.c_str()) == it->number) &&
						(enable.empty() || (enable == "true") == it->enable);
				}).
			limit(page, limit);
		return JsonResponse(result);
	}
	/**
	 * @brief 根据指定的ID，返回报警配置的编辑视图。如果未找到对应配置，则返回错误信息的JSON响应。
	 * @param id 要查找的报警配置的唯一标识符。
	 * @return 如果找到对应的报警配置，返回其编辑视图；否则，返回包含错误信息的JSON响应。
	 */
	[[Route("alarm/edit_view")]]
	[[FileMapping("alarm/edit.html")]]
	WebResponse edit_view(int id) {
		auto brand = xml_context::from<web_brand_config_info>().
			where([](auto it)
				{
					return it->enable;
				}).
			value();
		auto spec = xml_context::from<web_spec_config_info>().
			where([](auto it)
				{
					return it->enable;
				}).
			value();
		auto level = xml_context::from<web_level_config_info>().
			where([](auto it)
				{
					return it->enable;
				}).
			value();

		std::shared_ptr<web_alarm_config_info> result =
			xml_context::from<web_alarm_config_info>().
			where([id](auto it)
				{
					return id == it->id;
				}).
			first();

		if (result) {
			return View(*result, brand, spec, level);
		}
		return JsonResponse(web_message_info{ .success = false,.message = "不存在" });
	}
	/**
	 * @brief 编辑报警配置信息。
	 * @param value 包含要编辑的报警配置信息的对象。
	 * @return 返回一个包含操作结果的 WebResponse 对象。
	 */
	[[Method("POST")]]
	[[Route("alarm/edit")]]
	[[ContentType("application/json")]]
	WebResponse edit([[FromBody("")]] web_alarm_config_info value) {
		web_message_info result;
		xml_context::from<web_alarm_config_info>().
			where([value](auto it)
				{
					return it->id == value.id;
				}).
			update([value](auto it)
				{
					it->modify_time = v3::datetime::current_time_stamp();
					it->number = value.number;
					it->description = value.description;
					it->spec_no = value.spec_no;
					it->level_no = value.level_no;
					it->enable = value.enable;
					it->remarks = value.remarks;
					return true;
				}).
			submit();
		return JsonResponse(result);
	}
	/**
	 * @brief 返回用于添加警报的视图页面。
	 * @return 一个WebResponse对象，表示渲染的添加警报页面视图。
	 */
	[[Route("alarm/add_view")]]
	[[FileMapping("alarm/add.html")]]
	WebResponse add_view() {
		auto brand = xml_context::from<web_brand_config_info>().
			where([](auto it)
				{
					return it->enable;
				}).
			value();
		auto spec = xml_context::from<web_spec_config_info>().
			where([](auto it)
				{
					return it->enable;
				}).
			value();
		auto level = xml_context::from<web_level_config_info>().
			where([](auto it)
				{
					return it->enable;
				}).
			value();
		return View(brand, spec, level);
	}
	/**
	 * @brief 添加新的报警配置信息。
	 * @param value 要添加的报警配置信息对象。
	 * @return 包含操作结果的 WebResponse 对象。
	 */
	[[Method("POST")]]
	[[Route("alarm/add")]]
	[[ContentType("application/json")]]
	WebResponse add([[FromBody("")]] web_alarm_config_info value) {
		web_message_info result;
		value.id = 0;
		value.modify_time = v3::datetime::current_time_stamp();
		xml_context::from<web_alarm_config_info>().
			max(value.id, [](auto it)
				{
					return it->id;
				}).
			inc(value.id).
			append(value).
			submit();
		return JsonResponse(result);
	}
	/**
	 * @brief 根据提供的ID删除指定的告警配置。
	 * @param id 要删除的告警配置的唯一标识符。
	 * @return 包含操作结果的Web响应对象。
	 */
	[[Method("POST")]]
	[[Route("alarm/remove")]]
	WebResponse remove([[FromBody("id")]] int id) {
		web_message_info result;
		xml_context::from<web_alarm_config_info>().
			where([id](auto it)
				{
					return it->id == id;
				}).
			remove().
			submit();
		return JsonResponse(result);
	}
	/**
	 * @brief 同步报警信息的接口。
	 * @param key 请求同步的关键标识（从请求体中获取）。
	 * @return 返回一个包含操作结果的 WebResponse 对象，指示同步是否成功及相关信息。
	 */
	[[Method("POST")]]
	[[Route("alarm/sync")]]
	WebResponse sync([[FromBody("key")]] int key) {
		web_message_info result;
		try {
			g_message_bus.call("cloud_alarm_request", key);
		}
		catch (std::exception const& ec) {
			result.success = false;
			result.message = ec.what();
		}
		return JsonResponse(result);
	}
};