/**
 * @file trajectory_convert_main.cpp
 * @brief RM75 轨迹 CSV 转 C++ waypoint 工具入口文件。
 *
 * @author mashiro
 * @date 2026-07-09
 * @last_modified 2026-07-09
 *
 * @details
 * 本文件是离线轨迹转换工具入口，只负责 CLI 参数解析结果处理、调用 trajectory
 * 模块读取 CSV、导出 C++ waypoint 文件并返回退出码。它不连接真实机械臂，
 * 也不执行任何运动。
 *
 * 设计原则：
 * - 参数解析放在 config 层；
 * - CSV 读取和 C++ 文件生成放在 modules/trajectory 层；
 * - `main()` 不做字符串路径拆解；
 * - 所有失败路径输出明确错误。
 *
 * @dependencies
 * - rm_control/config/trajectory_convert_cli_config.h
 * - rm_control/modules/trajectory/trajectory_file_store.h
 */
#include "rm_control/config/trajectory_convert_cli_config.h"
#include "rm_control/modules/trajectory/trajectory_file_store.h"

#include <iostream>

/**
 * @brief 启动离线轨迹转换工具。
 *
 * @author mashiro
 * @date 2026-07-09
 * @last_modified 2026-07-09
 *
 * @details
 * 该函数先解析 CLI 参数，再加载轨迹 CSV，最后导出 C++ TCP waypoint 表。
 * 由于该工具只处理文件，不连接真实机械臂，因此可作为轨迹录制后的离线验证步骤。
 *
 * @param[in] argc 命令行参数数量。
 * @param[in] argv 命令行参数数组。
 *
 * @return 0 转换成功或帮助信息输出成功。
 * @return 1 CSV 加载失败。
 * @return 2 C++ 文件导出失败。
 * @return 64 命令行参数错误。
 *
 * @throws 本函数不主动抛出异常；底层模块通过 `Result` 返回错误。
 *
 * @note
 * 输入 CSV 文件必须符合 trajectory 模块写出的固定列格式。
 *
 * @warning
 * 本函数不会验证 waypoint 是否适合真实运动；后续执行轨迹前必须另做安全检查。
 *
 * @thread_safety
 * 按主线程入口函数设计，不提供多线程重入保证。
 *
 * @par 边界条件
 * 路径为空、文件不存在、CSV 为空、输出目录无权限都会返回非零退出码。
 *
 * @par 后续维护
 * 新增输出格式时应扩展 CLI 配置和 trajectory 模块，不要在入口文件写分支逻辑。
 */
int main(int argc, char **argv) {
    const auto cli_config = rm_control::config::ParseTrajectoryConvertCliArguments(argc, argv);
    if (!cli_config.ok) {
        std::cerr << "Invalid arguments: " << cli_config.error_message << '\n';
        rm_control::config::PrintTrajectoryConvertUsage(argv == nullptr ? nullptr : argv[0], std::cerr);
        return 64;
    }
    if (cli_config.value.help_requested) {
        rm_control::config::PrintTrajectoryConvertUsage(argv == nullptr ? nullptr : argv[0], std::cout);
        return 0;
    }

    const auto samples = rm_control::modules::trajectory::loadTrajectoryCsv(
        cli_config.value.input_csv_path);
    if (!samples.ok) {
        std::cerr << "Failed to load CSV: " << samples.error_message << '\n';
        return 1;
    }

    const auto export_result = rm_control::modules::trajectory::exportTcpPathCpp(
        cli_config.value.output_cpp_path, samples.value, cli_config.value.session_name);
    if (!export_result.ok) {
        std::cerr << "Failed to export C++: " << export_result.error_message << '\n';
        return 2;
    }

    std::cout << "Loaded samples: " << samples.value.size() << '\n'
              << "C++ TCP path: " << cli_config.value.output_cpp_path << '\n';
    return 0;
}
