#include <iostream>
#include <memory>
#include <string>
#include <grpcpp/grpcpp.h>
// 包含刚才手动翻译出的头文件
#include "agv_calib_control.grpc.pb.h" 

using namespace agv::calibration::control;

// 继承并实现定义在 .proto 里的服务契约
class AgvCalibServiceImpl final : public AgvCalibControlService::Service {
    
    // 覆盖接管控制权的方法
    grpc::Status SetControlMode(grpc::ServerContext* context, 
                                const ModeRequest* request, 
                                StandardResponse* reply) override {
        
        if (request->target_mode() == ModeRequest::OPEN_LOOP_MODE) {
            std::cout << "\n[Windows底层] 收到 Linux 指令: 进入开环提线木偶模式" << std::endl;
            // TODO: 在这里调用 Windows 原有的底盘驱动 DLL 或 CAN 接口，切断避障算法
            
            reply->set_success(true);
            reply->set_message("Windows 已交出控制权，避障与运动学逆解已关闭");
        }
        return grpc::Status::OK;
    }
    // TODO: 接着 override 实现 ExecuteOpenLoopCmd 等其他函数...
};

void RunServer() {
    // 🚨 关键排雷：必须绑定 0.0.0.0，千万不要写 localhost 或 127.0.0.1，否则 ROS2 连不上！
    std::string server_address("0.0.0.0:50051"); 
    AgvCalibServiceImpl service;

    grpc::ServerBuilder builder;
    builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
    builder.RegisterService(&service);
    
    std::unique_ptr<grpc::Server> server(builder.BuildAndStart());
    std::cout << "🚀 Windows 车端 gRPC 代理已启动，监听外部请求: " << server_address << std::endl;
    server->Wait();
}

int main() {
    RunServer();
    return 0;
}