package com.cmvr.edge.client.service.impl;

import cmvr.api.SystemCommand;
import cmvr.api.SystemServiceGrpc;
import com.alibaba.fastjson2.JSON;
import com.cmvr.device.domain.DeDeviceRegistration;
import com.cmvr.edge.client.manage.GrpcServiceManager;
import com.cmvr.edge.client.service.EdgeSystemService;
import com.cmvr.edge.client.utils.EdgeCommonUtil;
import lombok.RequiredArgsConstructor;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 边缘系统服务实现类
 * 用于与边缘系统进行gRPC通信，获取系统状态信息
 */
@Service
@RequiredArgsConstructor
public class EdgeSystemServiceImpl implements EdgeSystemService {
    /**
     * 日志记录器
     */
    private static final Logger logger = LoggerFactory.getLogger(EdgeSystemServiceImpl.class);

    private final GrpcServiceManager grpcServiceManager;


    public List<DeDeviceRegistration> deviceList(String terminalId){

        try {
        //调用接口获取返回值对象
        SystemCommand.GetSystemStatusCommand.Feedback response=getSystemStatus(terminalId);

        // 获取设备列表
        List<SystemCommand.DeviceList> deviceList = response.getDeviceListList();

        // 如果设备列表不为空，则处理设备信息
        if (!deviceList.isEmpty()) {
            // 创建Device对象列表，用于存储转换后的设备信息
            List<DeDeviceRegistration> devices = new ArrayList<>();

            // 遍历设备列表，将每个设备信息转换为Device对象
            for (SystemCommand.DeviceList device : deviceList) {
                DeDeviceRegistration d=new DeDeviceRegistration();
                // 设置设备ID
                d.setDeviceCode(device.getDeviceId());
                // 设置设备类型，将枚举类型转换为字符串
                d.setDeviceModel(device.getDeviceType().name());
                // 设置设备的终端ID
                d.setIdDeDeviceTerminalConfig(terminalId);

                devices.add(d);
            }

            // 记录获取到的设备数量
            logger.info("获取到设备列表，数量：{}", devices.size());
            return devices;
        }

        // 如果响应为空或设备列表为空，记录错误信息
        logger.error("获取系统状态失败: {}", response != null ?
                (response.getHeader() != null ? response.getHeader().getErrorMessage() : "响应头为空") : "响应为空");
        return null;

        }catch (Exception e){
            // 捕获并记录调用过程中的异常
            logger.error("调用系统状态接口异常", e);
            return null;
        }
    }

    @Override
    public String stopAll(String terminalId) {
        SystemServiceGrpc.SystemServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
                terminalId,
                SystemServiceGrpc.SystemServiceBlockingStub.class);
        SystemCommand.StopAllCommand.Request build = SystemCommand.StopAllCommand.Request.newBuilder()
                .setHeader(EdgeCommonUtil.buildRequest(""))
                .build();
        SystemCommand.StopAllCommand.Feedback feedback = stub.stopAll(build);
        return JSON.toJSONString(feedback.getHeader());
    }


    /**
     * 获取系统状态信息
     * 包括CPU使用率、内存使用情况、磁盘使用情况和设备列表等信息
     *
     * @return 系统状态信息，如果获取失败则返回null
     */
    @Override
    public SystemCommand.GetSystemStatusCommand.Feedback getSystemStatus(String terminalId) {
        try {
            // 创建gRPC阻塞式存根，用于调用服务端方法
            SystemServiceGrpc.SystemServiceBlockingStub stub = grpcServiceManager.getGrpcClient(
                    terminalId,
                    SystemServiceGrpc.SystemServiceBlockingStub.class);
            
            // 构建请求对象，由于是获取系统状态，请求参数为空
            SystemCommand.GetSystemStatusCommand.Request request = SystemCommand.GetSystemStatusCommand.Request.newBuilder().build();
            
            // 调用服务端方法获取系统状态
            SystemCommand.GetSystemStatusCommand.Feedback response = stub.getSystemStatus(request);
            
            // 检查响应是否有效
            if (response != null) {

                return response;
            }
            
            // 如果响应为空或设备列表为空，记录错误信息
            logger.error("获取系统状态失败: {}", response != null ? 
                (response.getHeader() != null ? response.getHeader().getErrorMessage() : "响应头为空") : "响应为空");
            return null;
        } catch (Exception e) {
            // 捕获并记录调用过程中的异常
            logger.error("调用系统状态接口异常", e);
            return null;
        }
    }
}