#pragma once

#include <cstdint>
#include <string>

namespace vehicle_agent_gateway
{

// 消息帧类型枚举
// 必须与 proto/transport_contract.proto 中的 Wifi6FrameType 保持一致。
// 帧格式：[4字节LE: msg_type][4字节LE: payload_len][payload_len字节: payload]
enum class MsgType : uint32_t
{
  // 底盘域
  CHASSIS_GET_READINESS_REQ  = 1,
  CHASSIS_GET_READINESS_RSP  = 2,
  CHASSIS_MOTION_PRIMITIVE_REQ = 3,
  CHASSIS_MOTION_PRIMITIVE_RSP = 4,
  CHASSIS_EMERGENCY_BRAKE_REQ  = 5,
  CHASSIS_EMERGENCY_BRAKE_RSP  = 6,

  // 运控域
  CONTROL_GET_READINESS_REQ  = 11,
  CONTROL_GET_READINESS_RSP  = 12,
  CONTROL_EVALUATION_REQ     = 13,
  CONTROL_EVALUATION_RSP     = 14,

  // 传感器域
  SENSOR_GET_READINESS_REQ   = 21,
  SENSOR_GET_READINESS_RSP   = 22,
  SENSOR_GET_LATEST_FRAME_REQ = 23,
  SENSOR_GET_LATEST_FRAME_RSP = 24,
  SENSOR_LIST_SENSORS_REQ    = 25,
  SENSOR_LIST_SENSORS_RSP    = 26,

  // 外部真值位姿域：车间工控机/真值系统通过 WiFi6 推给车端
  EXTERNAL_POSE_PUSH_REQ = 31,
  EXTERNAL_POSE_PUSH_RSP = 32,
};

// 向 fd 发送一帧。payload 可以为空（长度字段写 0）。
// 返回 true 表示发送成功，false 表示 write 失败。
bool send_frame(int fd, MsgType type, const std::string & payload);

// 从 fd 读取一帧，结果写入 out_type 和 out_payload。
// 返回 true 表示读取成功，false 表示读取失败（连接断开或超时）。
bool recv_frame(int fd, MsgType & out_type, std::string & out_payload);

}  // namespace vehicle_agent_gateway
