package com.project.zcustom.service.service.basics.impl;

import com.project.zcustom.domain.basics.PlatBasicsSystem;
import com.project.zcustom.mapper.service.basics.PlatBasicsSystemMapper;
import com.project.zcustom.service.service.basics.IPlatBasicsSystemService;
import com.project.common.core.domain.search.PageParamVo;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.project.common.utils.StringUtils;

import java.util.*;

/**
 * 系统运行峰值情况分析Service业务层处理
 *
 * @author change
 * @date 2024-10-21
 */
@Service
public class PlatBasicsSystemServiceImpl extends ServiceImpl<PlatBasicsSystemMapper, PlatBasicsSystem> implements IPlatBasicsSystemService {

    /**
     * 组装查询条件
     */
    private LambdaQueryWrapper<PlatBasicsSystem> getLambdaQueryWrapper(PlatBasicsSystem platBasicsSystem) {
        LambdaQueryWrapper<PlatBasicsSystem> lqw = new LambdaQueryWrapper<PlatBasicsSystem>();
        if (StringUtils.isNotBlank(platBasicsSystem.getAppOrg())) {
            lqw.eq(PlatBasicsSystem::getAppOrg, platBasicsSystem.getAppOrg());
        }
        if (StringUtils.isNotNull(platBasicsSystem.getSysType())) {
            lqw.eq(PlatBasicsSystem::getSysType, platBasicsSystem.getSysType());
        }
        return lqw;
    }

    /**
     * 分页查询系统运行峰值情况分析列表
     *
     * @param platBasicsSystem 系统运行峰值情况分析
     * @return 系统运行峰值情况分析集合
     */
    @Override
    public IPage<PlatBasicsSystem> pagingPlatBasicsSystemList(PlatBasicsSystem platBasicsSystem) {
        IPage<PlatBasicsSystem> page = new Page<>(platBasicsSystem.getPageNum(), platBasicsSystem.getPageSize());
        LambdaQueryWrapper<PlatBasicsSystem> lqw = getLambdaQueryWrapper(platBasicsSystem);
        // 排序 默认时间倒序
        lqw.orderByDesc(PlatBasicsSystem::getCreateTime);
        return baseMapper.selectPage(page, lqw);
    }

    /**
     * 分页查询系统运行峰值情况分析列表
     *
     * @param lqw
     * @return 系统运行峰值情况分析集合
     */
    @Override
    public IPage<PlatBasicsSystem> pagingPlatBasicsSystemList(PageParamVo pageParamVo, LambdaQueryWrapper<PlatBasicsSystem> lqw) {
        IPage<PlatBasicsSystem> page = new Page<>(pageParamVo.getPageNum(), pageParamVo.getPageSize());
        // 排序 默认时间倒序
        lqw.orderByDesc(PlatBasicsSystem::getCreateTime);
        return baseMapper.selectPage(page, lqw);
    }

    /**
     * 查询系统运行峰值情况分析列表
     *
     * @param platBasicsSystem 系统运行峰值情况分析
     * @return 系统运行峰值情况分析
     */
    @Override
    public List<PlatBasicsSystem> selectPlatBasicsSystemList(PlatBasicsSystem platBasicsSystem) {
        LambdaQueryWrapper<PlatBasicsSystem> lqw = getLambdaQueryWrapper(platBasicsSystem);
        // 排序 默认时间倒序
        lqw.orderByDesc(PlatBasicsSystem::getCreateTime);
        return baseMapper.selectList(lqw);
    }

    /**
     * 查询系统运行峰值情况分析列表
     *
     * @param platBasicsSystem 系统运行峰值情况分析
     * @return 系统运行峰值情况分析
     */
    @Override
    public List<PlatBasicsSystem> selectPlatBasicsSystemList(PlatBasicsSystem platBasicsSystem, Long limitNum) {
        LambdaQueryWrapper<PlatBasicsSystem> lqw = getLambdaQueryWrapper(platBasicsSystem);
        // 排序 默认时间倒序
        lqw.orderByDesc(PlatBasicsSystem::getCreateTime);
        lqw.last("limit " + limitNum);
        return baseMapper.selectList(lqw);
    }

    /**
     * 根据指定字段查询信息
     *
     * @param field      字段名称
     * @param filedValue 字段值
     * @return 系统运行峰值情况分析
     */
    @Override
    public PlatBasicsSystem getPlatBasicsSystemByField(String field, String filedValue) {
        QueryWrapper<PlatBasicsSystem> lqw = new QueryWrapper<PlatBasicsSystem>();
        lqw.eq(field, filedValue);
        lqw.last("limit 1");
        return this.getOne(lqw, false);
    }

    /**
     * 根据指定字段查询信息列表
     *
     * @param field      字段名称
     * @param filedValue 字段值
     * @return 系统运行峰值情况分析
     */
    @Override
    public List<PlatBasicsSystem> selectPlatBasicsSystemListByField(String field, String filedValue, Long limitNum) {
        QueryWrapper<PlatBasicsSystem> lqw = new QueryWrapper<PlatBasicsSystem>();
        lqw.eq(field, filedValue);
        lqw.last("limit " + limitNum);
        return this.list(lqw);
    }

    /**
     * 根据指定字段查询信息列表
     *
     * @param field      字段名称
     * @param filedValue 字段值
     * @return 系统运行峰值情况分析
     */
    @Override
    public List<PlatBasicsSystem> selectPlatBasicsSystemListByField(String field, String filedValue) {
        QueryWrapper<PlatBasicsSystem> lqw = new QueryWrapper<PlatBasicsSystem>();
        lqw.eq(field, filedValue);
        lqw.orderByAsc("sys_type");
        return this.list(lqw);
    }

    /**
     * 判断指定字段值是否存在
     *
     * @param field      字段名称
     * @param filedValue 字段值
     */
    @Override
    public void checkFieldExist(String field, String filedValue, String tips, Long id) {
        QueryWrapper<PlatBasicsSystem> lqw = new QueryWrapper<PlatBasicsSystem>();
        lqw.eq(field, filedValue);
        lqw.ne("id", id);
        if (this.getOne(lqw, false) != null) {
            throw new RuntimeException(tips + "已存在");
        }
    }

    /**
     * 系统运行峰值情况分析
     */
    @Override
    public Map<String, Object> getSystemRunData(String appOrg) {
        String[] typeList = new String[]{"CPU使用率", "内存使用率", "磁盘使用率", "网络流量"};
        String[] keyList = new String[]{"cpu", "memory", "disk", "insufficient"};
        List<PlatBasicsSystem> systemList = this.selectPlatBasicsSystemListByField("app_org", appOrg);
        String[] xList = new String[]{"0-6", "6-12", "12-18", "18-24"};
        Map<String, Object> resultMap = new HashMap<>();
        for (int i = 0; i < typeList.length; i++) {
            for (PlatBasicsSystem system : systemList) {
                Long[] yList = new Long[]{system.getBetween6Num(), system.getBetween12Num(), system.getBetween18Num(), system.getBetween24Num()};
                Map<String, Object> tempMap = new HashMap<>();
                if (Objects.equals(system.getSysType(), i)) {
                    StringUtils.createdTableData(Arrays.asList(xList), Arrays.asList(yList), "#2EC7C9", typeList[i], tempMap);
                    resultMap.put(keyList[i], tempMap);
                }
            }
        }
        return resultMap;
    }
}
