package com.njcn.device.device.service.impl;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.njcn.device.biz.enums.RunFlagEnum;
import com.njcn.device.device.mapper.DevVersionMapper;
import com.njcn.device.device.mapper.DeviceMapper;
import com.njcn.device.device.service.IDeviceService;
import com.njcn.device.device.service.ProgramVersionService;
import com.njcn.device.line.mapper.LineMapper;

import com.njcn.device.pq.pojo.po.Device;

import com.njcn.device.pq.pojo.vo.DevStatusNumVO;

import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;


/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author cdf
 * @since 2022-01-07
 */
@Service
@RequiredArgsConstructor
public class DeviceServiceImpl extends ServiceImpl<DeviceMapper, Device> implements IDeviceService {

    private final LineMapper lineMapper;
//    private final SocketClient socketClient;
    private final DevVersionMapper devVersionMapper;
    private final ProgramVersionService programVersionService;

    @Value("${socket.port:60000}")
    private Integer socketPort;

//    @Override
//    public String sentLine(ConstantValueParam.Constant param) {
//        try {
//            //获取根据监测点获取终端信息
//            UpDevVO upDevVO = lineMapper.getDevInfo(param.getId());
//            //查询前置ip
//            String host = lineMapper.getNodeIp(upDevVO.getDevIndex(),0);
//            //拼接属性
//            ContValueRVO upParamVO = new ContValueRVO();
//            ContValueVO valueVO = new ContValueVO();
//            valueVO.setType(param.getType());
//            valueVO.setLineid(param.getId());
//            valueVO.setHander(param.getHander());
//            JSONObject jsonStr = new JSONObject(valueVO);
//            Integer len = jsonStr.toString().length();
//            upParamVO.setLen(len.toString());
//            upParamVO.setData(valueVO);
//            JSONObject jsonObject = new JSONObject(upParamVO);
//            String str = jsonObject.toString();
//            List<UpDevVO> devList = new ArrayList<>();
//            devList.add(upDevVO);
//            return socketClient.sentLine(param.getIp(), str, host, socketPort, "wr", devList);
//        } catch (Exception e) {
//            return "获取定值失败";
//        }
//
//    }
//
//    @Override
//    public String sentLineData(ConstantValueParam.ValueData param) {
//        try {
//            //获取根据监测点获取终端信息
//            UpDevVO upDevVO = lineMapper.getDevInfo(param.getId());
//            //查询前置ip
//            String host = lineMapper.getNodeIp(upDevVO.getDevIndex(),0);
//            ContUpdateValueRVO upParamVO = new ContUpdateValueRVO();
//            ContUpdateValueVO valueVO = new ContUpdateValueVO();
//            valueVO.setType(param.getType());
//            valueVO.setLineid(param.getId());
//            valueVO.setHander(param.getHander());
//            float[] intArr;
//            if (StrUtil.isBlank(param.getInterValue())) {
//                intArr = new float[0];
//            } else {
//                String[] valueArr = param.getInterValue().split(",");
//                intArr = new float[valueArr.length];
//                for (int i = 0; i < valueArr.length; i++) {
//                    intArr[i] = Float.parseFloat(valueArr[i]);
//                }
//            }
//            valueVO.setValue(intArr);
//            JSONObject jsonStr = new JSONObject(valueVO);
//            Integer len = jsonStr.toString().length();
//            upParamVO.setLen(len.toString());
//            upParamVO.setData(valueVO);
//            JSONObject jsonObject = new JSONObject(upParamVO);
//            String str = jsonObject.toString();
//            List<UpDevVO> devList = new ArrayList<>();
//            devList.add(upDevVO);
//            return socketClient.sentLine(param.getIp(), str, host, socketPort, "wr", devList);
//        } catch (Exception e) {
//            return "运行失败";
//        }
//    }
//
//    @Override
//    public String sentDev(ConstantValueParam.Constant param) {
//        try {
//            Line line = lineMapper.selectById(param.getId());
//            UpDevVO upDevVO = new UpDevVO();
//            upDevVO.setDevIndex(line.getId());
//            upDevVO.setDevName(line.getName());
//            String host = lineMapper.getNodeIp(line.getId(),1);
//            ContValueRVO upParamVO = new ContValueRVO();
//            ContValueVO valueVO = new ContValueVO();
//            valueVO.setType(param.getType());
//            valueVO.setIndex(param.getId());
//            valueVO.setHander(param.getHander());
//            JSONObject jsonStr = new JSONObject(valueVO);
//            Integer len = jsonStr.toString().length();
//            upParamVO.setLen(len.toString());
//            upParamVO.setData(valueVO);
//            JSONObject jsonObject = new JSONObject(upParamVO);
//            String str = jsonObject.toString();
//            List<UpDevVO> devList = new ArrayList<>();
//            devList.add(upDevVO);
//            return socketClient.sentDZDev(param.getIp(), str, host, socketPort, "wr", devList);
//        } catch (Exception e) {
//            return "获取定值失败";
//        }
//    }
//
//    @Override
//    public String sentDevData(ConstantValueParam.ValueData param) {
//        try {
//            Line line = lineMapper.selectById(param.getId());
//            UpDevVO upDevVO = new UpDevVO();
//            upDevVO.setDevIndex(line.getId());
//            upDevVO.setDevName(line.getName());
//            String host = lineMapper.getNodeIp(line.getId(),1);
//            ContUpdateDevValueRVO upParamVO = new ContUpdateDevValueRVO();
//            ContUpdateDevValueVO valueVO = new ContUpdateDevValueVO();
//            valueVO.setType(param.getType());
//            valueVO.setIndex(line.getId());
//            valueVO.setHander(String.valueOf(param.getHander()));
//            int[] intArr;
//            if (StrUtil.isBlank(param.getInterValue())) {
//                intArr = new int[0];
//            } else {
//                String[] valueArr = param.getInterValue().split(",");
//                intArr = new int[valueArr.length];
//                for (int i = 0; i < valueArr.length; i++) {
//                    intArr[i] = Integer.parseInt(valueArr[i]);
//                }
//            }
//            valueVO.setInterValue(intArr);
//            JSONObject jsonStr = new JSONObject(valueVO);
//            Integer len = jsonStr.toString().length();
//            upParamVO.setLen(len.toString());
//            upParamVO.setData(valueVO);
//            JSONObject jsonObject = new JSONObject(upParamVO);
//            String str = jsonObject.toString();
//
//            List<UpDevVO> devList = new ArrayList<>();
//            devList.add(upDevVO);
//            return socketClient.sentDZDev(param.getIp(), str, host, socketPort, "wr", devList);
//        } catch (Exception e) {
//            return "运行失败";
//        }
//    }
//
//    @Override
//    public String socketDevProperty(String devID) {
//        String host = lineMapper.getNodeIp(devID,1);
//        if(StrUtil.isBlank(host)){
//            return "前置ip获取失败";
//        }
//        JSONObject jsonObject = new JSONObject();
//        Map<String,String> map = new HashMap<>();
//        map.put("type","190");
//        map.put("index",devID);
//        map.put("hander","1");
//        jsonObject.set("data", map);
//        Integer len = jsonObject.get("data").toString().length();
//        jsonObject.set("len", len.toString());
//        socketClient.showProperty(jsonObject.toString(),host,socketPort,RequestUtil.getLoginName());
//        return "终端性能获取成功";
//    }
//
//    @Override
//    public String socketDevPropertyClose(String devID) {
//        String host = lineMapper.getNodeIp(devID,1);
//        try {
//            JSONObject jsonObject = new JSONObject();
//            Map<String, String> map = new HashMap<>();
//            map.put("type", "190");
//            map.put("index", devID);
//            map.put("hander", "0");
//            jsonObject.set("data", map);
//            Integer len = jsonObject.get("data").toString().length();
//            jsonObject.set("len", len.toString());
//            socketClient.closeDevSocket(jsonObject.toString(),host,socketPort,RequestUtil.getLoginName());
//            return "执行成功";
//        }catch (Exception e){
//            return "执行失败";
//        }
//    }
//
//    @Override
//    public String realTimeData(String lineIndex) {
//        //查询前置ip
//        String host = lineMapper.getNodeIp(lineIndex,0);
//        if(StrUtil.isBlank(host)){
//            return "设备前置机服务器配置异常,请联系管理员";
//        }else {
//            JSONObject jsonObject = new JSONObject();
//            jsonObject.set("LineId", lineIndex);
//            jsonObject.set("type", 0);
//            JSONObject jsonObject1 = new JSONObject();
//            jsonObject1.set("len",0);
//            jsonObject1.set("data",jsonObject);
//            socketClient.realTimeData(jsonObject1.toString(),host,socketPort,lineIndex);
//        }
//        return "请求成功";
//    }
//
//    @Override
//    public String heartRealTimeData(String lineIndex) {
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.set("LineId", lineIndex);
//        jsonObject.set("type", 1);
//        JSONObject jsonObject1 = new JSONObject();
//        jsonObject1.set("len", 0);
//        jsonObject1.set("data", jsonObject);
//        String host = lineMapper.getNodeIp(lineIndex,0);
//        socketClient.heartRealData(jsonObject1.toString(),host,socketPort,lineIndex);
//        return "实时数据心跳请求成功";
//    }
//
//    @Override
//    public String closeRealTimeData(String lineIndex) {
//        socketClient.closeRealData(lineIndex);
//        return "关闭实时数据请求成功";
//    }
//
//    @Override
//    public String getDevUpgrades(List<String> list, String edIndex) {
//        List<DeviceIpRVO> resTemlist = new ArrayList<>();
//
//        List<DeviceIpRVO> relist = lineMapper.getDevicesIp(list);
//        //判断设备版本号
//        Integer isExit = devVersionMapper.selectCount(new LambdaQueryWrapper<DevVersion>()
//                .eq(DevVersion::getVersionId,edIndex)
//                .in(DevVersion::getLineId,list)
//                .eq(DevVersion::getState,1)
//        );
//        if (isExit > 0) {
//            return "请勿选择相同版本号升级";
//        }
//        if (!CollectionUtil.isEmpty(relist)) {
//            Version version = programVersionService.getById(edIndex);
//            String series = version.getDevType();
//            //判断设备是否存在相同型号
//            for (DeviceIpRVO deviceIpRVO : relist) {
//                if (!series.equals(deviceIpRVO.getDevSeries())) {
//                    return "当前装置版本系列与目标版本系列不相同";
//                }
//            }
//
//            //判断是否断开
//            if (relist.stream().filter(w -> w.getComFlag() == 0).findAny().isPresent()) {
//                return "存在通讯中断设备";
//            }
//
//
//            Set<String> set = new HashSet<>();
//            for (DeviceIpRVO d : relist) {
//                set.add(d.getIp());
//            }
//            Iterator<String> iterator = set.iterator();
//            while (iterator.hasNext()) {
//                List<UpDevVO> devIndex = new ArrayList<>();
//                DeviceIpRVO deviceIpRVO = new DeviceIpRVO();
//                String ip = iterator.next();
//                for (DeviceIpRVO d : relist) {
//                    UpDevVO upDevVO = new UpDevVO();
//                    upDevVO.setDevIndex(d.getDevIndex());
//                    upDevVO.setDevName(d.getDevName());
//                    if (ip.equals(d.getIp())) {
//                        devIndex.add(upDevVO);
//                    }
//                }
//                deviceIpRVO.setIp(ip);
//                deviceIpRVO.setDevlist(devIndex);
//                resTemlist.add(deviceIpRVO);
//            }
//        } else {
//            return "存在未知错误";
//        }
//        for (DeviceIpRVO deviceIpRVO : resTemlist) {
//            String ip = deviceIpRVO.getIp();
//            List<UpDevVO> devlist = deviceIpRVO.getDevlist();
//            UpDataVO upDataVO = new UpDataVO();
//            UpParamVO upParamVO = new UpParamVO();
//            upDataVO.setTerminal(devlist);
//            upDataVO.setType("180");
//            upDataVO.setEdIndex(edIndex);
//            upDataVO.setUserIndex(RequestUtil.getUserIndex());
//            JSONObject jsonstr = new JSONObject(upDataVO);
//            Integer len = jsonstr.toString().length();
//            upParamVO.setData(upDataVO);
//            upParamVO.setLen(len.toString());
//            JSONObject jsonObject = new JSONObject(upParamVO);
//            String str = jsonObject.toString();
//            socketClient.sentUpgrades(str, ip, socketPort, RequestUtil.getLoginName(), edIndex, devlist);
//        }
//        return "运行成功";
//    }
//
//    @Override
//    public String closeUpgrades(List<String> devList) {
//        List<DeviceIpRVO> relist = lineMapper.getDevicesIp(devList);
//        if(CollectionUtil.isEmpty(relist)){
//            return "前置机为空";
//        }else {
//            List<String> nodeIp = relist.stream().map(DeviceIpRVO::getIp).distinct().collect(Collectors.toList());
//            for(String ip: nodeIp){
//                List<DeviceIpRVO> devLl= relist.stream().filter(item->item.getIp().equals(ip)).collect(Collectors.toList());
//                if(CollectionUtil.isEmpty(devLl)){
//                    return "出错啦";
//                }
//
//                List<JSONObject> list = new ArrayList<>();
//                for(DeviceIpRVO devRVO:devLl){
//                    JSONObject dev = new JSONObject();
//                    dev.put("devIndex",devRVO.getDevIndex());
//                    dev.put("devName",devRVO.getDevName());
//                    list.add(dev);
//                }
//                JSONObject jsonObject = new JSONObject();
//                jsonObject.set("terminal", list);
//                jsonObject.set("type", 182);
//                JSONObject jsonObject1 = new JSONObject();
//                jsonObject1.set("len", 0);
//                jsonObject1.set("data", jsonObject);
//                socketClient.cancelUp(jsonObject1.toString(),ip,socketPort,devLl.size());
//            }
//        }
//        return "取消命令发送成功";
//    }
//
//    @Override
//    public String restartDev(List<String> devList) {
//        List<DeviceIpRVO> relist = lineMapper.getDevicesIp(devList);
//        if(CollUtil.isEmpty(relist)){
//            return "前置机为空";
//        }else {
//            List<String> nodeIp = relist.stream().map(DeviceIpRVO::getIp).distinct().collect(Collectors.toList());
//            for(String ip: nodeIp){
//                List<DeviceIpRVO> devLl = relist.stream().filter(item->item.getIp().equals(ip)).collect(Collectors.toList());
//                if(CollUtil.isEmpty(devLl)){
//                    return "出错啦";
//                }
//
//                List<JSONObject> list = new ArrayList<>();
//                List<String> devIn = new ArrayList<>();
//                for(DeviceIpRVO devRVO:devLl){
//                    devIn.add(devRVO.getDevIndex());
//                    JSONObject dev = new JSONObject();
//                    dev.set("devIndex", devRVO.getDevIndex());
//                    dev.set("devName", devRVO.getDevName());
//                    list.add(dev);
//                }
//
//                JSONObject jsonObject = new JSONObject();
//                jsonObject.set("terminal", list);
//                jsonObject.set("type", 181);
//                jsonObject.set("userIndex", RequestUtil.getUserIndex());
//                JSONObject jsonObject1 = new JSONObject();
//                jsonObject1.set("len", 0);
//                jsonObject1.set("data", jsonObject);
//
//                socketClient.restartDev(jsonObject1.toString(),ip,socketPort,devIn);
//            }
//        }
//        return "命令发送成功";
//    }

    @Override
    public void updateDevCheckTime(String devId, String thisTimeCheck, String nextTimeCheck) {
        LambdaUpdateWrapper<Device> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(Device::getId, devId)
                .set(Device::getThisTimeCheck, thisTimeCheck)
                .set(Device::getNextTimeCheck, nextTimeCheck);
        this.update(updateWrapper);
    }


    @Override
    public DevStatusNumVO statisticDevNum(List<String> devIds) {
        DevStatusNumVO devStatusNumVO = new DevStatusNumVO();
        List<Device> deviceList = this.baseMapper.selectList(new LambdaQueryWrapper<Device>().in(Device::getId,devIds));
        Map<Integer,Long> map = deviceList.stream().collect(Collectors.groupingBy(Device::getRunFlag,Collectors.counting()));
        devStatusNumVO.setRunNum(map.getOrDefault(RunFlagEnum.RUNNING.getStatus(),0L).intValue());
        devStatusNumVO.setCheckNum(map.getOrDefault(RunFlagEnum.CHECK.getStatus(),0L).intValue());
        devStatusNumVO.setStopRunNum(map.getOrDefault(RunFlagEnum.STOP.getStatus(),0L).intValue());
        devStatusNumVO.setQuiteNum(map.getOrDefault(RunFlagEnum.QUIT.getStatus(),0L).intValue());
        devStatusNumVO.setTestNum(map.getOrDefault(RunFlagEnum.TEST.getStatus(),0L).intValue());
        devStatusNumVO.setAllNum(deviceList.size());
        return devStatusNumVO;
    }


}
