#pragma once

#include "rm_control/common/result.h"

#include <cstdint>
#include <vector>

namespace flight_robot::realman {

/**
 * @brief 将 Modbus 16 位寄存器编码为 RM_API2 使用的高字节、低字节 int 序列。
 *
 * @reason RM_API2 的多寄存器接口以 `int*` 承载 `num * 2` 个字节；集中编码可避免每个
 *         厂商调用各自实现位移和掩码，并允许完全脱离硬件验证边界值。
 *
 * @author 唐永康
 * @date 2026-07-11
 *
 * @param register_values 按 Modbus 地址递增排列的 16 位寄存器值；不得为空。
 * @return 成功时每个寄存器生成两个 0..255 的 int，顺序为高字节后低字节；输入为空或
 *         长度无法安全扩展为两倍时返回失败。
 *
 * @calls 只使用标准库容器和整数位运算，不调用 RM_API2。
 * @safety 纯数据转换，不连接设备，也不触发机械臂或 O6 动作。
 * @note 返回缓冲区长度严格等于 `register_values.size() * 2`。
 */
rm_control::common::Result<std::vector<int>>
EncodeModbusRegistersAsRmApiHighLowBytes(
    const std::vector<std::uint16_t> &register_values);

/**
 * @brief 将 RM_API2 返回的高低字节 int 序列解码为 Modbus 16 位寄存器。
 *
 * @reason RM_API2 文档把 `int*` 元素描述为 int8，不同实现可能返回有符号 int8 或
 *         0..255 原始字节；统一验证和归一化可拒绝掩码会静默截断的非法整数。
 *
 * @author 唐永康
 * @date 2026-07-11
 *
 * @param rm_api_high_low_bytes 高字节、低字节交替排列的 RM_API2 int 序列；不得为空。
 * @return 成功时返回按地址递增的寄存器；长度为奇数或元素超出 -128..255 时返回失败。
 *
 * @calls 只使用标准库容器和整数位运算，不调用 RM_API2。
 * @safety 纯数据转换，不连接设备，也不触发机械臂或 O6 动作。
 * @note -128..-1 按有符号 int8 的同位无符号字节归一化，编码函数始终输出 0..255。
 */
rm_control::common::Result<std::vector<std::uint16_t>>
DecodeModbusRegistersFromRmApiHighLowBytes(
    const std::vector<int> &rm_api_high_low_bytes);

} // namespace flight_robot::realman
