#pragma once

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

#include <string>
#include <vector>

namespace rm_control::interfaces {

// 机械臂抽象接口。
// core 只依赖这个接口，不直接依赖 RealManRobotArm 或 rm_interface.h。
// 后续如果更换机械臂品牌，只要新增一个实现 IRobotArm 的 driver，
// JSON 指令解析和 JsonCommandRunner 都可以继续复用。
class IRobotArm {
public:
    virtual ~IRobotArm() = default;

    // 建立/释放硬件连接。具体 SDK 初始化细节放在 drivers 层。
    virtual common::Result<void> connect(const common::RobotConnectionConfig &config) = 0;
    virtual void disconnect() = 0;

    // 只读接口：适合自动诊断和状态显示，不会造成机械臂运动。
    virtual common::Result<common::RobotInfo> getRobotInfo() = 0;
    virtual common::Result<common::ArmState> getCurrentArmState() = 0;
    virtual common::Result<common::ForceData> getForceData() = 0;

    // 关节空间运动。joints_deg 是绝对关节角，单位为度。
    virtual common::Result<void> moveJ(const std::vector<float> &joints_deg,
                                       int speed_percent,
                                       int blend_radius,
                                       int trajectory_connect,
                                       bool blocking) = 0;

    // 笛卡尔直线运动。pose 是绝对 TCP 位姿，单位见 common::Pose。
    virtual common::Result<void> moveL(const common::Pose &pose,
                                       int speed_percent,
                                       int blend_radius,
                                       int trajectory_connect,
                                       bool blocking) = 0;

    // 拖动示教生命周期。上层只表达“开始/停止/保存”，具体使用普通拖动、
    // 六维力复合拖动或厂商文件格式都由 driver 实现。
    virtual common::Result<void> startDragTeach(const common::DragTeachStartOptions &options) = 0;
    virtual common::Result<void> stopDragTeach() = 0;
    virtual common::Result<common::SavedVendorTrajectory>
    saveDragTeachTrajectory(const std::string &path) = 0;
};

} // namespace rm_control::interfaces
