#pragma once
//robotics
#include <robotics/mvc.hpp>
#include <robotics/logger.hpp>
//local
#include "../xml/xml_context.hpp"
#include "../response/response.hpp"

using namespace robotics;
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 FileResponse		= robotics::v3::mvc::file_response;
using DownloadResponse	= robotics::v3::mvc::download_response;
using HtmlResponse		= robotics::v3::mvc::html_response;
using CaptchaResponse	= robotics::v3::mvc::captcha_response<100, 38, 4, 2, 100>;
using View				= robotics::v3::mvc::view;

/* ************************************************
* 作者:Lenovo
* 时间:2024/6/3 11:04:02
* 机器名:DESKTOP-4I13MDL
* 控制器名:account
* *************************************************/
class account {
public:
	account() {
	}
	/**
	 * @brief 返回登录页面的响应。
	 * @return 包含登录页面视图的 WebResponse 对象。
	 */
	[[Authen(false, "home/index")]]
	[[Route("account/index")]]
	[[FileMapping("account/index.html")]]
	WebResponse index() {
		//返回登录页面
		return View();
	}
	/**
	 * @brief 生成验证码并重置会话 Cookie。
	 * @param v 请求参数，通常用于指定验证码相关信息。
	 * @return 返回包含验证码信息的 WebResponse 对象。
	 */
	[[Authen(false, "home/index")]]
	[[Route("account/captcha")]]
	WebResponse captcha(std::string v) {
		HttpContext::reset_cookie();
		return CaptchaResponse("code");
	}
	/**
	 * @brief 处理用户登录请求，验证验证码和用户凭据，并返回登录结果。
	 * @param username 用户的登录名。
	 * @param password 用户的登录密码。
	 * @param captcha 用户输入的验证码。
	 * @return 包含登录结果的 WebResponse 对象，包括操作是否成功及相关消息。
	 */
	[[Method("POST")]]
	[[Authen(false, "home/index")]]
	[[Route("account/login")]]
	WebResponse login(
		[[FromBody("username")]] std::string username, 
		[[FromBody("password")]] std::string password,
		[[FromBody("captcha")]]  std::string captcha) {
		web_message_info result;
		if (HttpContext::captcha_compare("code", captcha, result.success, result.message)) {
			auto user = xml_context::from<web_user_config_info>().
				where([username, password](auto it)
					{
						return it->code == username and it->password == password and it->enable;
					}).
				first();
			if (user) {
				HttpContext::add_authen_session("user", *user);
				result.message = "登录成功!";
			}
			else {
				result.success = false;
				result.message = "用户名或密码错误!";
			}
		}
		return JsonResponse(result);
	}
	/**
	 * @brief 执行用户注销操作并返回默认页面响应。
	 * @return 包含默认页面内容的 WebResponse 对象。
	 */
	[[Route("account/logout")]]
	WebResponse logout() {
		HttpContext::remove_cookie();
		return default_page_response();
	}
};