#pragma once

#include "rm_control/common/result.h"
#include "rm_control/common/robot_types.h"

#include <filesystem>
#include <string>
#include <vector>

namespace rm_control::modules::trajectory {

struct TrajectoryStoragePaths {
    std::string root_dir;
    std::string csv_dir;
    std::string vendor_dir;
    std::string converted_dir;
    std::string reports_dir;
};

struct TrajectoryFileSet {
    std::string session_name;
    std::string csv_path;
    std::string vendor_path;
    std::string converted_cpp_path;
    std::string report_path;
};

std::string timestampString();
std::string sanitizeSessionName(const std::string &raw_name);
std::string defaultTrajectoryStorageRoot();

common::Result<TrajectoryStoragePaths> ensureTrajectoryStorage(const std::string &root_dir);
common::Result<TrajectoryFileSet> makeTrajectoryFileSet(const std::string &root_dir,
                                                        const std::string &session_name);

common::Result<void> writeTrajectoryCsv(const std::string &csv_path,
                                        const std::vector<common::TrajectorySample> &samples);

/**
 * @brief 使用 `std::filesystem::path` 新建同步 RM75 轨迹 CSV，目标存在时拒绝覆盖。
 *
 * @reason 原始采集会话必须保持唯一且可追溯，不能沿用旧接口的截断覆盖语义。
 *
 * @author 唐永康
 * @date 2026-07-10
 *
 * @param csv_path 新会话内的同步 CSV 路径；调用方保留路径所有权。
 * @param samples 已全部保存在内存中的连续七关节样本。
 * @return 新文件完整写入、刷新并关闭时成功；目标已存在或任何文件操作失败时返回上下文。
 *
 * @calls std::filesystem::create_directories、std::filesystem::exists 和 std::ofstream。
 * @safety 只写新的本地 CSV，不连接设备，也不触发硬件动作。
 * @note 当前格式使用 sample_index、timestamp_ms、J1..J7、TCP 和 source 共 16 列。
 */
common::Result<void> writeTrajectoryCsvWithoutOverwrite(
    const std::filesystem::path &csv_path,
    const std::vector<common::TrajectorySample> &samples);
common::Result<std::vector<common::TrajectorySample>> loadTrajectoryCsv(const std::string &csv_path);

common::Result<void> exportTcpPathCpp(const std::string &cpp_path,
                                      const std::vector<common::TrajectorySample> &samples,
                                      const std::string &session_name);

} // namespace rm_control::modules::trajectory
