#pragma once

#include "rm_control/common/result.h"
#include "rm_control/modules/trajectory/vendor_drag_trajectory_parser.h"

#include <filesystem>

namespace rm_control::modules::trajectory {

/**
 * @brief 返回运行期反向厂商轨迹文件的默认保存目录。
 *
 * @reason 反向轨迹是由只读原始轨迹派生的运行期产物，必须与 sourceTXT 原件分开保存，
 *         避免误改、覆盖或把派生文件冒充原始记录。
 *
 * @author 唐永康
 * @date 2026-07-11
 *
 * @return CMake 注入的 runtime_data/reversed_vendor_trajectories 路径。
 *
 * @calls 仅构造 std::filesystem::path，不访问文件系统。
 * @safety 不读取轨迹、不连接设备，也不会触发 RM75 或 O6 动作。
 */
std::filesystem::path DefaultReversedVendorTrajectoryDirectory();

/**
 * @brief 从已解析的只读厂商轨迹创建逐物理行严格倒序的只读副本。
 *
 * @reason RM75 位于原轨迹末点时，不能通过放大首点距离限制直接跨越到首点；本函数生成
 *         可由控制器沿相同关节路点反向执行的独立 TXT 产物，同时保留原文件不变。
 *
 * @author 唐永康
 * @date 2026-07-11
 *
 * @param forward_trajectory 已由 ParseVendorDragTrajectoryJsonLines 严格解析的正向轨迹；
 *        源文件必须仍是无写权限、非符号链接的普通文件，大小和 SHA-256 必须与元数据一致。
 * @param output_directory 反向产物根目录；函数在其下原子创建唯一子目录，绝不覆盖既有文件。
 * @return 成功时返回对 0444 反向文件重新解析得到的完整元数据；失败时只清理本次新建产物。
 *
 * @calls CalculateFileSha256、ParseVendorDragTrajectoryJsonLines 和 std::filesystem 文件接口。
 * @safety 仅执行离线文件读取、派生写入和校验，不连接硬件，也不发送任何运动指令。
 * @note 输出保持每一物理行的字节内容和换行风格，只反转行顺序；重新解析后的第 i 个样本
 *       必须逐字段等于正向轨迹的第 N-1-i 个关节样本。
 */
common::Result<VendorDragTrajectoryParseResult>
CreateReadOnlyReversedVendorTrajectoryWithoutOverwrite(
    const VendorDragTrajectoryParseResult &forward_trajectory,
    const std::filesystem::path &output_directory);

} // namespace rm_control::modules::trajectory
