#pragma once
#include <behaviortree_cpp_v3/action_node.h>
#include <grpcpp/grpcpp.h>
// 引入 CMake 自动生成的 C++ 网络契约头文件！
#include "agv_calib_control.grpc.pb.h"

using namespace agv::calibration::control;

// =========================================================
// 🌟 真实网络积木：连接车端并夺取控制权
// =========================================================
class ConnectAGVNode : public BT::SyncActionNode {
public:
    // 注意：构造函数这里多了一个 const BT::NodeConfiguration& config 参数
    ConnectAGVNode(const std::string& name, const BT::NodeConfiguration& config) : BT::SyncActionNode(name, config) {
        // 1. 初始化时，拨号连接到车端 (因为我们要自己测，所以先连本机 127.0.0.1 端口)
        channel_ = grpc::CreateChannel("127.0.0.1:50051", grpc::InsecureChannelCredentials());
        stub_ = AgvCalibControlService::NewStub(channel_);
    }
    
    // 行为树必须的静态函数 (定义端口)
    static BT::PortsList providedPorts() { return {}; }

    BT::NodeStatus tick() override {
        std::cout << "\n💻 [行为树真节点] 正在通过 gRPC 向车端发起夺权请求..." << std::endl;
        
        // 2. 准备发送载荷：要求进入调优模式
        ModeRequest request;
        request.set_target_mode(ModeRequest::TUNING_MODE);
        
        StandardResponse response;
        grpc::ClientContext context;
        
        // 🚨 架构师防线：设置 2 秒网络超时！如果网络断了，绝不让主线程死锁卡住！
        context.set_deadline(std::chrono::system_clock::now() + std::chrono::seconds(2));

        // 3. 发射真正的网络脉冲！
        grpc::Status status = stub_->SetControlMode(&context, request, &response);

        // 4. 根据网络回复，决定行为树这根树枝是亮绿灯还是红灯
        if (status.ok() && response.success()) {
            std::cout << "✅ [网络通信成功] 车端回执: " << response.message() << std::endl;
            return BT::NodeStatus::SUCCESS; // 绿灯，允许行为树执行下一步
        } else {
            std::cerr << "❌ [网络通信失败] 错误码: " << status.error_code() 
                      << " 详情: " << status.error_message() << std::endl;
            return BT::NodeStatus::FAILURE; // 红灯，触发行为树重试或报警
        }
    }

private:
    std::shared_ptr<grpc::Channel> channel_;
    std::unique_ptr<AgvCalibControlService::Stub> stub_;
};