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.InitialSwitchOtherCollectData;
import com.ruoyi.rocketmq.enums.SwitchLogo;
import com.ruoyi.rocketmq.mapper.InitialSwitchOtherCollectDataMapper;
import com.ruoyi.rocketmq.service.IInitialSwitchOtherCollectDataService;
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 InitialSwitchOtherCollectDataServiceImpl implements IInitialSwitchOtherCollectDataService 
{
    @Autowired
    private InitialSwitchOtherCollectDataMapper initialSwitchOtherCollectDataMapper;

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

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

    /**
     * 新增交换机系统其他信息采集数据
     * 
     * @param initialSwitchOtherCollectData 交换机系统其他信息采集数据
     * @return 结果
     */
    @Override
    public int insertInitialSwitchOtherCollectData(InitialSwitchOtherCollectData initialSwitchOtherCollectData)
    {
        return initialSwitchOtherCollectDataMapper.insertInitialSwitchOtherCollectData(initialSwitchOtherCollectData);
    }

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

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

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

    @Override
    public Map getSwitchMonitorMsg(InitialSwitchOtherCollectData initialSwitchOtherCollectData) {

        return initialSwitchOtherCollectDataMapper.getSwitchMonitorMsg(initialSwitchOtherCollectData);
    }

    /**
     * 图形监控交换机设备CPU使用率
     * @param initialSwitchOtherCollectData
     * @return
     */
    @Override
    public Map<String, Object> getSwitchCpuUseMsg(InitialSwitchOtherCollectData initialSwitchOtherCollectData) {
        initialSwitchOtherCollectData.setCollectType(SwitchLogo.设备CPU使用率.getCode());
        List<InitialSwitchOtherCollectData> list = initialSwitchOtherCollectDataMapper.selectInitialSwitchOtherCollectDataList(initialSwitchOtherCollectData);

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

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

    /**
     * 图形监控交换机设备系统功率
     * @param initialSwitchOtherCollectData
     * @return
     */
    @Override
    public Map<String, Object> getSwitchPowerMsg(InitialSwitchOtherCollectData initialSwitchOtherCollectData) {
        initialSwitchOtherCollectData.setCollectType(SwitchLogo.系统平均功率.getCode());
        List<InitialSwitchOtherCollectData> avgList = initialSwitchOtherCollectDataMapper.selectInitialSwitchOtherCollectDataList(initialSwitchOtherCollectData);
        initialSwitchOtherCollectData.setCollectType(SwitchLogo.系统实时功率.getCode());
        List<InitialSwitchOtherCollectData> currentList = initialSwitchOtherCollectDataMapper.selectInitialSwitchOtherCollectDataList(initialSwitchOtherCollectData);
        // 先按时间排序
        avgList.sort(Comparator.comparing(InitialSwitchOtherCollectData::getCreateTime));
        currentList.sort(Comparator.comparing(InitialSwitchOtherCollectData::getCreateTime));

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

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

        List<Object> currentPowerData = new ArrayList<>();
        // 如果两个列表的时间点不完全一致，需要匹配时间
        for (InitialSwitchOtherCollectData avgData : avgList) {
            Optional<InitialSwitchOtherCollectData> match = currentList.stream()
                    .filter(current -> current.getCreateTime().equals(avgData.getCreateTime()))
                    .findFirst();

            if (match.isPresent()) {
                try {
                    currentPowerData.add(Double.parseDouble(match.get().getCollectValue()));
                } catch (NumberFormatException e) {
                    currentPowerData.add(0);
                }
            } else {
                currentPowerData.add(0); // 没有对应时间点的数据用0
            }
        }
        Map<String, Object> yData = new HashMap<>();
        yData.put("switchAvgPower", avgPowerData);
        yData.put("switchcurrentPower", currentPowerData);
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("xData", xData);
        resultMap.put("yData", yData);
        return resultMap;
    }

    /**
     * 图形监控交换机设备内存使用率
     * @param initialSwitchOtherCollectData
     * @return
     */
    @Override
    public Map<String, Object> getSwitchMemUseMsg(InitialSwitchOtherCollectData initialSwitchOtherCollectData) {
        initialSwitchOtherCollectData.setCollectType(SwitchLogo.设备内存使用率.getCode());
        List<InitialSwitchOtherCollectData> list = initialSwitchOtherCollectDataMapper.selectInitialSwitchOtherCollectDataList(initialSwitchOtherCollectData);

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

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