// cmake_service_test.cpp: 定义应用程序的入口点。
//

//stl
#include <iostream>
//robotics
#include <robotics/application.hpp>
#include <robotics/message_bus.hpp>
#include <robotics/singleton.hpp>
#include <robotics/dump.hpp>
#include <robotics/mvc.hpp>
//local
#include "core/core.hpp"
#include "aop/aop.hpp"
#include "reflect.h"

using namespace robotics;

v3::message_bus g_message_bus;

/**
 * @brief service 类是一个基于 v3::application_base 的 HTTP 服务应用，负责初始化、启动和停止 HTTP 服务器。
 */
class service : public v3::application_base {
    using http_server = v3::mvc::http_server<http_before, http_error, http_after>;
public:
    /**
     * @brief service 构造函数，初始化服务的根目录和端口号。
     */
    explicit service() {
        std::string root_directory = std::filesystem::current_path().string() + "/views";
        port_ = v3::config::read<int>("MVC", "PORT", 8002);
        root_directory = v3::config::read<std::string>("MVC", "PATH", root_directory);
        http_server_.set_root_directory(root_directory);
    }
private:
    /**
     * @brief 启动核心组件和 HTTP 服务器，并记录服务启动状态。
     */
    virtual void run() override {
        core_.start();
        bool result = http_server_.start("0.0.0.0", port_);
        LOG_INFO << "服务启动完成,状态:" << result << ".";
    }
    /**
     * @brief 停止服务并记录服务已停止的信息。
     */
    virtual void stop() override {
        http_server_.stop();
        core_.stop();
        LOG_INFO << "服务停止完成.";
    }
private:
    core            core_;
    int             port_ = 80;
    http_server     http_server_;
};
/**
 * @brief 程序的入口点，初始化服务并启动应用程序。
 * @param argc 命令行参数的数量。
 * @param argv 命令行参数的字符串数组。
 * @return 程序的退出状态码。
 */
int main(int argc, char* argv[])
{
    DUMP_INSTALL;
	SINGLETON("after_service");
    return v3::application<service>::run(argc, argv);
}

