//package io.wdd.rpc.status.service;
//
//import com.fasterxml.jackson.core.JsonProcessingException;
//import io.wdd.common.utils.TimeUtils;
//import io.wdd.rpc.beans.request.MetricQueryEntity;
//import io.wdd.rpc.message.OctopusMessage;
//import io.wdd.rpc.message.OctopusMessageType;
//import io.wdd.rpc.message.handler.OMessageReplayContent;
//import io.wdd.rpc.message.sender.OMessageToAgentSender;
//import io.wdd.rpc.status.beans.AgentStatus;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.data.redis.core.RedisTemplate;
//
//import javax.annotation.Resource;
//import java.time.LocalDateTime;
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.CountDownLatch;
//import java.util.concurrent.TimeUnit;
//import java.util.stream.Collectors;
//
//import static io.wdd.common.config.OctopusObjectMapperConfig.OctopusObjectMapper;
//import static io.wdd.rpc.message.handler.OMessageHandler.WaitFromAgent;
//import static io.wdd.rpc.status.OctopusStatusMessage.*;
//
//@Slf4j
////@Service
//public class SyncStatusServiceImpl implements SyncStatusService {
//
//    private static final OctopusMessageType CurrentAppOctopusMessageType = OctopusMessageType.STATUS;
//
//    @Resource
//    OMessageToAgentSender oMessageToAgentSender;
//
//    @Resource
//    RedisTemplate redisTemplate;
//
//    @Override
//    public Map<String, Boolean> SyncCollectAgentAliveStatus(List<String> agentTopicNameList, int aliveStatusWaitMaxTime) {
//
//        // 构造最后的结果Map
//        Map<String, Boolean> agentAliveStatusMap = agentTopicNameList
//                .stream()
//                .collect(
//                        Collectors.toMap(
//                                agentTopicName -> agentTopicName,
//                                agentTopicName -> Boolean.FALSE
//                        ));
//
//        // 当前的时间
//        LocalDateTime currentTime = TimeUtils.currentFormatTime();
//
//        // 构造OctopusMessage - StatusMessage结构体, 下发所有的消息
//        buildAndSendAgentStatusOctopusMessage(
//                agentTopicNameList,
//                HEALTHY_STATUS_MESSAGE_TYPE,
//                currentTime
//        );
//
//        // 同步收集消息
//        OMessageReplayContent statusSyncReplayContend = OMessageReplayContent.build(
//                agentTopicNameList.size(),
//                CurrentAppOctopusMessageType,
//                currentTime
//        );
//        WaitFromAgent();
//
//        // 解析结果
//        CountDownLatch countDownLatch = statusSyncReplayContend.getCountDownLatch();
//
//        // 等待状态返回的结果
//        boolean agentAliveStatusCollectResult = false;
//        try {
//            agentAliveStatusCollectResult = countDownLatch.await(
//                    aliveStatusWaitMaxTime,
//                    TimeUnit.SECONDS
//            );
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        } finally {
//            if (!agentAliveStatusCollectResult) {
//                log.debug("Agent存活状态检查，没有检查到全部的Agent！");
//            }
//
//            // 移除等待队列
//            asyncWaitOctopusMessageResultService.stopWaiting(statusSyncReplayContend);
//
//            // 处理结果
//            statusSyncReplayContend
//                    .getReplayOMList()
//                    .stream()
//                    .forEach(
//                            statusOMessage -> {
//                                if (statusOMessage.getResult() != null) {
//                                    agentAliveStatusMap.put(
//                                            statusOMessage.getUuid(),
//                                            Boolean.TRUE
//                                    );
//                                }
//                            }
//                    );
//        }
//
//        // 返回Agent的存活状态内容
//        return agentAliveStatusMap;
//    }
//
//    @Override
//    public Map<String, AgentStatus> SyncCollectAgentMetricStatus(List<String> agentTopicNameList, int collectMetricWaitMaxTime) {
//
//        // 状态的结果Map
//        HashMap<String, AgentStatus> metricMap = new HashMap<>();
//
//        // 当前的时间
//        LocalDateTime currentTime = TimeUtils.currentFormatTime();
//
//        // 构造所有的Metric的OM并且下发
//        buildAndSendAgentStatusOctopusMessage(
//                agentTopicNameList,
//                METRIC_STATUS_MESSAGE_TYPE,
//                currentTime
//        );
//
//        // 同步等待结果, 并且解析结果
//        OMessageReplayContent metricSyncReplayContend = OMessageReplayContent.build(
//                agentTopicNameList.size(),
//                CurrentAppOctopusMessageType,
//                currentTime
//        );
//        asyncWaitOctopusMessageResultService.waitFor(metricSyncReplayContend);
//
//        // 解析结果
//        CountDownLatch countDownLatch = metricSyncReplayContend.getCountDownLatch();
//
//        // 等待状态返回的结果
//        boolean agentAliveStatusCollectResult = false;
//        try {
//            agentAliveStatusCollectResult = countDownLatch.await(
//                    collectMetricWaitMaxTime,
//                    TimeUnit.SECONDS
//            );
//        } catch (InterruptedException e) {
//            log.error("[Agent Metric] - 收集Agent的运行状态失败!");
//            throw new RuntimeException(e);
//        } finally {
//            if (!agentAliveStatusCollectResult) {
//                log.debug("Agent存活状态检查，没有检查到全部的Agent！");
//            }
//
//            // 移除等待队列
//            asyncWaitOctopusMessageResultService.stopWaiting(metricSyncReplayContend);
//
//            // 处理结果
//            metricSyncReplayContend
//                    .getReplayOMList()
//                    .stream()
//                    .forEach(
//                            statusOMessage -> {
//                                if (statusOMessage.getResult() != null) {
//
//                                    // 解析Result对象为 AgentStatus
//                                    try {
//
//                                        AgentStatus agentStatus = OctopusObjectMapper.readValue(
//                                                (String) statusOMessage.getResult(),
//                                                AgentStatus.class
//                                        );
//
//                                        // 保存结果
//                                        metricMap.put(
//                                                statusOMessage.getUuid(),
//                                                agentStatus
//                                        );
//
//                                    } catch (JsonProcessingException e) {
//                                        log.error("[Agent Metric] - 解析AgentStatus失败!");
//                                        throw new RuntimeException(e);
//                                    }
//
//                                }
//                            }
//                    );
//        }
//
//        return metricMap;
//    }
//
//    @Override
//    public ArrayList<AgentStatus> QueryMetricStatus(MetricQueryEntity metricQueryEntity) {
//
//        String queryRedisKey = metricQueryEntity.getAgentTopicName() + "-Metric";
//
//        if (!redisTemplate.hasKey(queryRedisKey)) {
//            log.error(
//                    "[Metric] - 查询到没有此Agent {} 的Metric信息，直接返回！",
//                    metricQueryEntity.getAgentTopicName()
//            );
//        }
//
//        double start = metricQueryEntity.getMetricStartTimeStamp();
//        double end = metricQueryEntity.getMetricEndTimeStamp();
//
//        ArrayList<AgentStatus> statusArrayList = new ArrayList<>();
//
//        redisTemplate
//                .opsForZSet()
//                .rangeByScore(
//                        queryRedisKey,
//                        start,
//                        end
//                )
//                .stream()
//                .forEachOrdered(
//                        metricString -> {
//                            try {
//
//                                AgentStatus agentStatus = OctopusObjectMapper.readValue(
//                                        (String) metricString,
//                                        AgentStatus.class
//                                );
//
//                                statusArrayList.add(agentStatus);
//
//                            } catch (JsonProcessingException e) {
//                                throw new RuntimeException(e);
//                            }
//                        }
//                );
//
//
//        return statusArrayList;
//    }
//
//
//    /**
//     * 2023年7月10日 通用的底层构造方法 Status类型的Octopus Message
//     *
//     * @param agentTopicNameList
//     * @param statusType
//     * @param currentTime
//     * @return
//     */
//    private List<OctopusMessage> buildAndSendAgentStatusOctopusMessage(List<String> agentTopicNameList, String statusType, LocalDateTime currentTime) {
//
//        List<OctopusMessage> octopusStatusMessageList = agentTopicNameList
//                .stream()
//                .map(
//                        agentTopicName -> ConstructAgentStatusMessage(
//                                statusType,
//                                agentTopicName,
//                                currentTime
//                        )
//                )
//                .collect(Collectors.toList());
//
//        // 发送信息
//        oMessageToAgentSender.send(octopusStatusMessageList);
//
//        return octopusStatusMessageList;
//    }
//
//
//}
