package com.ruoyi.rocketmq.service.impl;

import com.ruoyi.common.core.utils.DateUtils;
import com.ruoyi.common.core.utils.EchartsDataUtils;
import com.ruoyi.rocketmq.domain.InitialCpuInfo;
import com.ruoyi.rocketmq.domain.InitialSystemOtherCollectData;
import com.ruoyi.rocketmq.enums.ServerLogoEnum;
import com.ruoyi.rocketmq.mapper.InitialCpuInfoMapper;
import com.ruoyi.rocketmq.mapper.InitialSystemOtherCollectDataMapper;
import com.ruoyi.rocketmq.service.IInitialSystemOtherCollectDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 交换机系统其他信息采集数据Service业务层处理
 * 
 * @author gyt
 * @date 2025-09-23
 */
@Service
public class InitialSystemOtherCollectDataServiceImpl implements IInitialSystemOtherCollectDataService 
{
    @Autowired
    private InitialSystemOtherCollectDataMapper initialSystemOtherCollectDataMapper;
    @Autowired
    private InitialCpuInfoMapper initialCpuInfoMapper;

    /**
     * 查询交换机系统其他信息采集数据
     * 
     * @param id 交换机系统其他信息采集数据主键
     * @return 交换机系统其他信息采集数据
     */
    @Override
    public InitialSystemOtherCollectData selectInitialSystemOtherCollectDataById(Long id)
    {
        return initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataById(id);
    }

    /**
     * 查询交换机系统其他信息采集数据列表
     * 
     * @param initialSystemOtherCollectData 交换机系统其他信息采集数据
     * @return 交换机系统其他信息采集数据
     */
    @Override
    public List<InitialSystemOtherCollectData> selectInitialSystemOtherCollectDataList(InitialSystemOtherCollectData initialSystemOtherCollectData)
    {
        return initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);
    }

    /**
     * 新增交换机系统其他信息采集数据
     * 
     * @param initialSystemOtherCollectData 交换机系统其他信息采集数据
     * @return 结果
     */
    @Override
    public int insertInitialSystemOtherCollectData(InitialSystemOtherCollectData initialSystemOtherCollectData)
    {
        return initialSystemOtherCollectDataMapper.insertInitialSystemOtherCollectData(initialSystemOtherCollectData);
    }

    /**
     * 修改交换机系统其他信息采集数据
     * 
     * @param initialSystemOtherCollectData 交换机系统其他信息采集数据
     * @return 结果
     */
    @Override
    public int updateInitialSystemOtherCollectData(InitialSystemOtherCollectData initialSystemOtherCollectData)
    {
        initialSystemOtherCollectData.setUpdateTime(DateUtils.getNowDate());
        return initialSystemOtherCollectDataMapper.updateInitialSystemOtherCollectData(initialSystemOtherCollectData);
    }

    /**
     * 批量删除交换机系统其他信息采集数据
     * 
     * @param ids 需要删除的交换机系统其他信息采集数据主键
     * @return 结果
     */
    @Override
    public int deleteInitialSystemOtherCollectDataByIds(Long[] ids)
    {
        return initialSystemOtherCollectDataMapper.deleteInitialSystemOtherCollectDataByIds(ids);
    }

    /**
     * 删除交换机系统其他信息采集数据信息
     * 
     * @param id 交换机系统其他信息采集数据主键
     * @return 结果
     */
    @Override
    public int deleteInitialSystemOtherCollectDataById(Long id)
    {
        return initialSystemOtherCollectDataMapper.deleteInitialSystemOtherCollectDataById(id);
    }

    /**
     * 获取服务器图形监控监控项基础信息
     * @param initialSystemOtherCollectData
     * @return
     */
    @Override
    public Map getMonitorMsg(InitialSystemOtherCollectData initialSystemOtherCollectData) {
        Map<String, Object> map = initialSystemOtherCollectDataMapper.getMonitorMsg(initialSystemOtherCollectData);
        // 如果返回null，初始化一个空的Map
        if (map == null) {
            map = new HashMap<>();
        }
        // 获取cpu数量
        InitialCpuInfo cpuInfo = initialCpuInfoMapper.getCpuInfoByClientId(initialSystemOtherCollectData.getClientId());
        if (cpuInfo == null) {
            cpuInfo = new InitialCpuInfo();
        }
        map.put("systemCpuNum", cpuInfo.getNum());
        return map;
    }

    /**
     * 查询系统登陆用户数(个)监控信息列表并封装为多折线ECharts图表数据
     * @param initialSystemOtherCollectData
     * @return
     */
    @Override
    public Map<String, Object> systemUserNumEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData) {
        initialSystemOtherCollectData.setCollectType(ServerLogoEnum.登录用户数.getCode());
        List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);

        Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
        extractors.put("usersNumData", InitialSystemOtherCollectData::getCollectValue);

        return EchartsDataUtils.buildEchartsData(list,InitialSystemOtherCollectData::getCreateTime, extractors);
    }

    /**
     * 查询交换卷文件的可用空间监控信息列表并封装为多折线ECharts图表数据
     * @param initialSystemOtherCollectData 查询参数
     * @return ECharts图表数据
     */
    @Override
    public Map<String, Object> systemSwapSizeFreeEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData) {
        initialSystemOtherCollectData.setCollectType(ServerLogoEnum.交换卷文件的可用空间.getCode());
        List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);

        Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
        extractors.put("swapSizeFreeData", InitialSystemOtherCollectData::getCollectValue);

        return EchartsDataUtils.buildEchartsData(list, InitialSystemOtherCollectData::getCreateTime, extractors);
    }

    /**
     * 查询内存利用率监控信息列表并封装为多折线ECharts图表数据
     * @param initialSystemOtherCollectData 查询参数
     * @return ECharts图表数据
     */
    @Override
    public Map<String, Object> memoryUtilizationEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData) {
        initialSystemOtherCollectData.setCollectType(ServerLogoEnum.内存利用率.getCode());
        List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);

        Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
        extractors.put("memoryUtilizationData", InitialSystemOtherCollectData::getCollectValue);

        return EchartsDataUtils.buildEchartsData(list, InitialSystemOtherCollectData::getCreateTime, extractors);
    }

    /**
     * 查询可用交换空间百分比监控信息列表并封装为多折线ECharts图表数据
     * @param initialSystemOtherCollectData 查询参数
     * @return ECharts图表数据
     */
    @Override
    public Map<String, Object> systemSwapSizePercentEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData) {
        initialSystemOtherCollectData.setCollectType(ServerLogoEnum.可用交换空间百分比.getCode());
        List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);

        Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
        extractors.put("swapSizePercentData", InitialSystemOtherCollectData::getCollectValue);

        return EchartsDataUtils.buildEchartsData(list, InitialSystemOtherCollectData::getCreateTime, extractors);
    }

    /**
     * 查询可用内存监控信息列表并封装为多折线ECharts图表数据
     * @param initialSystemOtherCollectData 查询参数
     * @return ECharts图表数据
     */
    @Override
    public Map<String, Object> memorySizeAvailableEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData) {
        initialSystemOtherCollectData.setCollectType(ServerLogoEnum.可用内存.getCode());
        List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);

        Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
        extractors.put("memorySizeAvailableData", InitialSystemOtherCollectData::getCollectValue);

        return EchartsDataUtils.buildEchartsData(list, InitialSystemOtherCollectData::getCreateTime, extractors);
    }

    /**
     * 查询可用内存百分比监控信息列表并封装为多折线ECharts图表数据
     * @param initialSystemOtherCollectData 查询参数
     * @return ECharts图表数据
     */
    @Override
    public Map<String, Object> memorySizePercentEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData) {
        initialSystemOtherCollectData.setCollectType(ServerLogoEnum.可用内存百分比.getCode());
        List<InitialSystemOtherCollectData> list = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);

        Map<String, Function<InitialSystemOtherCollectData, ?>> extractors = new LinkedHashMap<>();
        extractors.put("memorySizePercentData", InitialSystemOtherCollectData::getCollectValue);

        return EchartsDataUtils.buildEchartsData(list, InitialSystemOtherCollectData::getCreateTime, extractors);
    }

    /**
     * 查询进程数监控信息列表并封装为多折线ECharts图表数据
     * 包含总进程数和正在运行的进程数两条折线
     * @param initialSystemOtherCollectData 查询参数
     * @return ECharts图表数据
     */
    @Override
    public Map<String, Object> procNumEcharts(InitialSystemOtherCollectData initialSystemOtherCollectData) {
        // 查询总进程数数据
        initialSystemOtherCollectData.setCollectType(ServerLogoEnum.进程数.getCode());
        List<InitialSystemOtherCollectData> procNumList = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);

        // 查询正在运行的进程数数据
        initialSystemOtherCollectData.setCollectType(ServerLogoEnum.正在运行的进程数.getCode());
        List<InitialSystemOtherCollectData> procNumRunList = initialSystemOtherCollectDataMapper.selectInitialSystemOtherCollectDataList(initialSystemOtherCollectData);

        // 先按时间排序
        procNumList.sort(Comparator.comparing(InitialSystemOtherCollectData::getCreateTime));
        procNumRunList.sort(Comparator.comparing(InitialSystemOtherCollectData::getCreateTime));

        // 提取x轴数据（以总进程数的时间为准）
        List<String> xData = procNumList.stream()
                .map(data -> {
                    SimpleDateFormat sdf = new SimpleDateFormat("MM-dd HH:mm");
                    return sdf.format(data.getCreateTime());
                })
                .collect(Collectors.toList());

        // 提取总进程数y轴数据
        List<Object> procNumData = procNumList.stream()
                .map(data -> {
                    try {
                        return Double.parseDouble(data.getCollectValue());
                    } catch (NumberFormatException e) {
                        return 0;
                    }
                })
                .collect(Collectors.toList());

        // 提取正在运行的进程数y轴数据，并匹配时间点
        List<Object> procNumRunData = new ArrayList<>();
        for (InitialSystemOtherCollectData procNumDataItem : procNumList) {
            Optional<InitialSystemOtherCollectData> match = procNumRunList.stream()
                    .filter(procNumRun -> procNumRun.getCreateTime().equals(procNumDataItem.getCreateTime()))
                    .findFirst();

            if (match.isPresent()) {
                try {
                    procNumRunData.add(Double.parseDouble(match.get().getCollectValue()));
                } catch (NumberFormatException e) {
                    procNumRunData.add(0);
                }
            } else {
                procNumRunData.add(0); // 没有对应时间点的数据用0填充
            }
        }

        // 构建返回数据
        Map<String, Object> yData = new HashMap<>();
        yData.put("procNumData", procNumData);          // 总进程数数据
        yData.put("procNumRunData", procNumRunData);    // 正在运行的进程数数据

        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("xData", xData);                  // 时间轴数据
        resultMap.put("yData", yData);                  // 数值数据

        return resultMap;
    }
}
