#pragma once

#include <array>
#include <string>
#include <vector>

namespace rm_control::common {

// 机械臂连接参数。当前默认值是本地 RM75 控制器，
// 后续换机械臂或换 IP 时应优先通过 JSON 覆盖，而不是改驱动代码。
struct RobotConnectionConfig {
    std::string ip = "192.168.1.18";
    int port = 8080;
    int timeout_ms = 1000;
};

// 通用 TCP 位姿结构，位置单位为 m，欧拉角单位为 rad。
// 这里不用 rm_pose_t，是为了让 core/config 不直接依赖睿尔曼 SDK。
struct Pose {
    float x = 0.0F;
    float y = 0.0F;
    float z = 0.0F;
    float rx = 0.0F;
    float ry = 0.0F;
    float rz = 0.0F;
};

// 只保留上层业务真正需要的机器人基础信息，避免把 RM SDK 结构体泄漏到 core。
struct RobotInfo {
    int arm_dof = 0;
    int arm_model = 0;
    int force_type = 0;
    int controller_version = 0;
};

// 当前机械臂状态：关节角、TCP 位姿、错误码。
// joints_deg 的长度由真实机械臂自由度决定，RM75 当前是 7。
struct ArmState {
    std::vector<float> joints_deg;
    Pose tcp_pose;
    std::vector<int> error_codes;
};

// 六维力数据。数组顺序固定为 Fx, Fy, Fz, Mx, My, Mz。
// raw/zero/work_zero/tool_zero 对应 RM_API2 返回的四组力数据。
struct ForceData {
    std::array<float, 6> raw{};
    std::array<float, 6> zero{};
    std::array<float, 6> work_zero{};
    std::array<float, 6> tool_zero{};
};

enum class DragTeachMode {
    OrdinaryRecorded,
    SixDofForcePositionAndOrientation,
};

struct DragTeachStartOptions {
    DragTeachMode mode = DragTeachMode::SixDofForcePositionAndOrientation;
    bool record_vendor_trajectory = true;
    bool enable_singular_wall = true;
};

struct SavedVendorTrajectory {
    std::string path;
    int point_count = 0;
};

struct TrajectorySample {
    long long elapsed_ms = 0;
    std::vector<float> joints_deg;
    Pose tcp_pose;
};

} // namespace rm_control::common
