#pragma once

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

#include <cstddef>
#include <cstdint>
#include <filesystem>
#include <string>
#include <vector>

namespace rm_control::modules::trajectory {

inline constexpr std::int64_t kRealmanVendorRawUnitsPerDegree = 1000;
inline constexpr const char *kRealmanVendorDragTrajectorySource =
    "realman_rm_save_trajectory_jsonl";

struct VendorDragTrajectoryParseResult {
    std::filesystem::path source_file;
    std::vector<common::TrajectorySample> samples;
    std::size_t trajectory_point_count = 0U;
    std::uintmax_t source_file_size_bytes = 0U;
    std::string source_file_sha256;
    std::string source = kRealmanVendorDragTrajectorySource;
    std::int64_t sample_period_ms = 0;
    std::int64_t raw_units_per_degree = kRealmanVendorRawUnitsPerDegree;
    bool timestamp_is_derived = true;
};

/**
 * @brief 严格解析 RealMan 厂商拖动轨迹 JSONL，并生成 RM75 七轴工程样本。
 *
 * @reason 厂商原始文件只有七个整数关节值，没有时间戳和单位元数据；调用方必须显式提供采样周期，解析器再以可追溯比例转换为 degree 并标记时间戳为推导值。
 *
 * @author 唐永康
 * @date 2026-07-10
 *
 * @param file_path 厂商原始 JSONL 普通文件；本函数只读该路径且拒绝符号链接、目录和空文件。
 * @param sample_period_ms 相邻样本的明确采样周期，单位 millisecond，必须大于 0。
 * @param raw_units_per_degree 每 degree 对应的厂商整数单位数，必须大于 0；本项目当前默认显式声明为 1000。
 * @return 成功时返回七轴 degree 样本、推导时间戳、点数、原文件字节数与 SHA-256；任何格式、范围、文件一致性或 I/O 错误均失败。
 *
 * @calls CalculateFileSha256、std::filesystem::symlink_status、file_size 和 last_write_time。
 * @safety 仅离线读取和转换文件，不连接机械臂，也不会触发拖动示教或轨迹回放。
 * @note 每个物理行必须严格为 `{"point":[七个 JSON 整数]}`，空行也会失败；原格式没有 TCP 位姿，因此输出样本的 tcp_pose 保持默认零值，不能据此执行 TCP 回放。
 */
common::Result<VendorDragTrajectoryParseResult> ParseVendorDragTrajectoryJsonLines(
    const std::filesystem::path &file_path,
    std::int64_t sample_period_ms,
    std::int64_t raw_units_per_degree = kRealmanVendorRawUnitsPerDegree);

} // namespace rm_control::modules::trajectory
