#pragma once

#include "rm_control/common/result.h"
#include "rm_control/config/json_command.h"
#include "rm_control/interfaces/robot_arm.h"

#include <iosfwd>

namespace rm_control::core {

// JSON 指令执行器。
// 这个类只负责流程编排和安全校验，不直接包含 rm_interface.h。
// 真实硬件动作通过 IRobotArm 注入，保证后续可替换机械臂驱动。
class JsonCommandRunner {
public:
    explicit JsonCommandRunner(interfaces::IRobotArm &robot);

    common::Result<void> run(const config::JsonCommandProgram &program, std::ostream &out);

private:
    // 所有运动命令发送前都必须经过这里。
    // 绝对 movej 检查“目标与当前值差值”，相对 movej_delta 检查“单次增量”，
    // movej_delta_steps 检查“每步增量”，避免 JSON 写错导致大幅跳动。
    common::Result<void> validateMotionCommand(const config::JsonCommandProgram &program,
                                               const config::ArmCommand &command,
                                               const common::ArmState &current_state) const;

    interfaces::IRobotArm &robot_;
};

} // namespace rm_control::core
