#pragma once

#include <string>

#include "vehicle_agent_gateway/proto_frame.hpp"

namespace vehicle_agent_gateway
{

// 同步阻塞 TCP 客户端。
// 每次调用 send_recv 都在调用线程内完成：connect → send REQ帧 → recv RSP帧 → disconnect。
// 设计为短连接，每次请求独立建连，避免连接状态管理复杂度。
class TcpClient
{
public:
  TcpClient(const std::string & host, uint16_t port, int timeout_ms = 5000);

  // 发送一个 REQ 帧并等待对应的 RSP 帧。
  // req_type：请求帧类型；req_payload：请求 payload（可为空）。
  // rsp_type：期望的响应帧类型；rsp_payload：响应 payload 输出。
  // 返回 false 表示连接失败、发送失败、超时或帧类型不符。
  bool send_recv(
    MsgType req_type,
    const std::string & req_payload,
    MsgType rsp_type,
    std::string & rsp_payload);

private:
  std::string host_;
  uint16_t port_;
  int timeout_ms_;

  // 建立 TCP 连接，返回 socket fd，失败返回 -1。
  int connect_to_server() const;
};

}  // namespace vehicle_agent_gateway
