package com.zehong.system.service.impl;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.zehong.common.core.domain.entity.SysUser;
import com.zehong.common.core.domain.model.LoginUser;
import com.zehong.common.utils.DateUtils;
import com.zehong.common.utils.SecurityUtils;
import com.zehong.common.utils.ServletUtils;
import com.zehong.system.domain.*;
import com.zehong.system.service.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zehong.system.mapper.TDeviceInfoMapper;

import javax.annotation.Resource;

/**
 * 设备信息Service业务层处理
 *
 * @author zehong
 * @date 2022-01-27
 */
@Service
public class TDeviceInfoServiceImpl implements ITDeviceInfoService
{
    @Resource
    private TDeviceInfoMapper tDeviceInfoMapper;

    @Resource
    IPipeInterfaceService iPipeInterfaceService;

    @Resource
    private ITDetectorUserService tDetectorUserService;


    @Resource
    private ITDeviceUserService tDeviceUserService;

    @Resource
    private ITVideoManagerService itVideoManagerService;

    @Resource
    private ITYehuaqiUserService yehuaqiUserService;

    /**
     * 查询设备信息
     *
     * @param deviceId 设备信息ID
     * @return 设备信息
     */
    @Override
    public TDeviceInfo selectTDeviceInfoById(Long deviceId)
    {
        return tDeviceInfoMapper.selectTDeviceInfoById(deviceId);
    }

    /**
     * 查询设备信息列表
     *
     * @param tDeviceInfo 设备信息
     * @return 设备信息
     */
    @Override
    public List<TDeviceInfo> selectTDeviceInfoList(TDeviceInfo tDeviceInfo)
    {
        return tDeviceInfoMapper.selectTDeviceInfoList(tDeviceInfo);
    }

    /**
     *
     * 大屏端 全局搜素 设备,场站,用户信息,监控  步骤一
     * */
    @Override
    public Map<Object, List<Map<String, Object>>> queryBasicInforByNameForBigWindows(String name) {
        Map<Object, List<Map<String, Object>>> stringListHashMap = new HashMap<>();
        List<Map<String, Object>> maps = tDeviceInfoMapper.queryBasicInforByNameForBigWindows(name);
        if (maps.size() > 0) {
            stringListHashMap = maps.stream().collect(Collectors.groupingBy((item -> item.get("type"))));
        }

        return stringListHashMap;
    }

    /**
     *
     * 大屏端 全局搜素 设备,场站,用户信息,监控  步骤二
     * */
    @Override
    public Object queryBasicInforByTypeAndIdForBigWindows(String type, String id) {

        // 1 是阀门井  2 是调压箱 都是查询 device 表
        if(("1".equals(type) || "2".equals(type)) && id != null) {
            return initPressureFlow(id);
        }

        // 3  是场站
        if(("3".equals(type)) && id != null) {
            return initTSiteStationInfoData(id);
        }
        // 4 5 6 是居民用户,商业用户,工业用户
        if(("4".equals(type) || "5".equals(type) || "6".equals(type)) && id != null) {
            TDetectorUser tDetectorUser = new TDetectorUser();
            tDetectorUser.setUserId(Long.parseLong(id));
            return tDetectorUserService.detectorUserList(tDetectorUser);
        }

        //7 是监控
        if ("7".equals(type)) {
            return itVideoManagerService.selectTVideoManagerById(Long.parseLong(id));
        }

        //8 是餐饮单位液化气用户
        if("8".equals(type) && id != null) {
            TYehuaqiUser tYehuaqiUser = new TYehuaqiUser();
            tYehuaqiUser.setUserId(Long.parseLong(id));

            List<TYehuaqiUser> tYehuaqiUsers = yehuaqiUserService.selectAllUserList(tYehuaqiUser);
            if (tYehuaqiUsers.size() > 0) {
                return tYehuaqiUsers.get(0);
            }
        }

        //9 是管道
        if("9".equals(type) && id != null) {
            return iPipeInterfaceService.getPipeBypipeId(id);
        }

        return null;
    }

    /**
     * 封装场站信息
     * @param deviceId 设备id
     * @return object
     */
    private Object initTSiteStationInfoData(String deviceId) {
        TSiteStationInfoDataList tSiteStationInfoDataList = new TSiteStationInfoDataList();
        List<TSiteStationInfoData> TSiteStationInfoDataList=new ArrayList<>();
        //查询场站下级设备数据
        List<PressureFlow> pressureFlows = iPipeInterfaceService.selecttSiteStationInfoDataList(deviceId);
        //临时存储压力表数据数组
        List<PressureFlow> pressureList=new ArrayList<>();
        //临时存储流量计数据数组
        List<PressureFlow> flowmeterList=new ArrayList<>();
        //临时存储探测器数据数组
        List<PressureFlow> detectorList=new ArrayList();
        /**循环下级全部数据*/
        for (int s=0;s<pressureFlows.size();s++){
            //判断是压力表还是流量计   1压力表  2流量计 3探测器
            if (pressureFlows.get(s).getDeviceType().equals("1")){
                pressureList.add(pressureFlows.get(s));
            }else if (pressureFlows.get(s).getDeviceType().equals("2")){
                flowmeterList.add(pressureFlows.get(s));
            }else if (pressureFlows.get(s).getDeviceType().equals("3")){
                detectorList.add(pressureFlows.get(s));
            }
        }
        //创建下级数据list数组
        List<SubordinateEquipmentList> subordinateEquipmentLists=new ArrayList<>();
        /**循环三次  每次代表 1压力表  2流量计  3探测器*/
        for (int t=0;t<3;t++){
            SubordinateEquipmentList subordinateEquipmentList=new SubordinateEquipmentList();
            if (t==0){  /**添加压力表数据*/
                if (pressureList.size()!=0){
                    /**查询下级在线设备数量*/
                    int onLine = iPipeInterfaceService.selectOnlineQuantity(pressureList, 0);
                    subordinateEquipmentList.setOnlineEquipment(onLine);
                    /**查询下级离线设备数量*/
                    int offLine = iPipeInterfaceService.selectOnlineQuantity(pressureList, 1);
                    subordinateEquipmentList.setOfflineEquipment(offLine);
                    /**查询历史报警数量*/
                    int historicalAlarm = iPipeInterfaceService.selectHistoricalAlarm(pressureList);
                    subordinateEquipmentList.setHistoricalAlarm(historicalAlarm);
                    /**查询已处理报警*/
                    int processAlarm = iPipeInterfaceService.selectProcessAlarm(pressureList);
                    subordinateEquipmentList.setAlarmProcessed(processAlarm);
                    /**查询报警中*/
                    int inAlarm = iPipeInterfaceService.selectInAlarm(pressureList);
                    subordinateEquipmentList.setInAlarm(inAlarm);
                    subordinateEquipmentList.setNumberPressureGauges(pressureList.size());
                }
                subordinateEquipmentList.setDataType(1);
            }else if (t==1){  /**添加流量计数据*/
                if (flowmeterList.size()!=0){
                    /**查询下级在线设备数量*/
                    int onLine = iPipeInterfaceService.selectOnlineQuantity(flowmeterList, 0);
                    subordinateEquipmentList.setOnlineEquipment(onLine);
                    /**查询下级离线设备数量*/
                    int offLine = iPipeInterfaceService.selectOnlineQuantity(flowmeterList, 1);
                    subordinateEquipmentList.setOfflineEquipment(offLine);
                    /**查询历史报警数量*/
                    int historicalAlarm = iPipeInterfaceService.selectHistoricalAlarm(flowmeterList);
                    subordinateEquipmentList.setHistoricalAlarm(historicalAlarm);
                    /**查询已处理报警*/
                    int processAlarm = iPipeInterfaceService.selectProcessAlarm(flowmeterList);
                    subordinateEquipmentList.setAlarmProcessed(processAlarm);
                    /**查询报警中*/
                    int inAlarm = iPipeInterfaceService.selectInAlarm(flowmeterList);
                    subordinateEquipmentList.setInAlarm(inAlarm);
                    subordinateEquipmentList.setNumberPressureGauges(flowmeterList.size());
                }
                subordinateEquipmentList.setDataType(2);
            }else if (t==2){  /**添加探测器数据*/
                if (detectorList.size()!=0){
                    /**查询下级在线设备数量*/
                    int onLine = iPipeInterfaceService.selectOnlineQuantity(detectorList, 0);
                    subordinateEquipmentList.setOnlineEquipment(onLine);
                    /**查询下级离线设备数量*/
                    int offLine = iPipeInterfaceService.selectOnlineQuantity(detectorList, 1);
                    subordinateEquipmentList.setOfflineEquipment(offLine);
                    /**查询历史报警数量*/
                    int historicalAlarm = iPipeInterfaceService.selectHistoricalAlarm(detectorList);
                    subordinateEquipmentList.setHistoricalAlarm(historicalAlarm);
                    /**查询已处理报警*/
                    int processAlarm = iPipeInterfaceService.selectProcessAlarm(detectorList);
                    subordinateEquipmentList.setAlarmProcessed(processAlarm);
                    /**查询报警中*/
                    int inAlarm = iPipeInterfaceService.selectInAlarm(detectorList);
                    subordinateEquipmentList.setInAlarm(inAlarm);
                    subordinateEquipmentList.setNumberPressureGauges(detectorList.size());
                }
                subordinateEquipmentList.setDataType(3);
            }
            subordinateEquipmentLists.add(subordinateEquipmentList);
        }
        TSiteStationInfoData deviceData=new TSiteStationInfoData();
        deviceData.setSubordinateEquipmentList(subordinateEquipmentLists);
        TSiteStationInfoDataList.add(deviceData);
        tSiteStationInfoDataList.setData(TSiteStationInfoDataList);
        return tSiteStationInfoDataList;
    }


    /**
     * 封装 阀门井和调压箱数据
     * @param deviceId 设备id
     * @return object
     */
    private Object initPressureFlow (String deviceId) {

        //最后返回的封装类型
        DeviceList deviceList=new DeviceList();
        List<DeviceData> DeviceList=new ArrayList<>();
        //查询关联设备下级数据方法
        List<PressureFlow> pressureFlows = iPipeInterfaceService.selectPressureFlow(deviceId);
        //临时存储压力表数据数组
        List<PressureFlow> pressureList=new ArrayList<>();
        //临时存储流量计数据数组
        List<PressureFlow> flowmeterList=new ArrayList<>();
        //临时存储探测器数据数组
        List<PressureFlow> detectorList=new ArrayList();
        /**循环下级全部数据*/
        for (int s=0;s<pressureFlows.size();s++){
            //判断是压力表还是流量计   1压力表  2流量计 3探测器
            if (pressureFlows.get(s).getDeviceType().equals("1")){
                pressureList.add(pressureFlows.get(s));
            }else if (pressureFlows.get(s).getDeviceType().equals("2")){
                flowmeterList.add(pressureFlows.get(s));
            }else if (pressureFlows.get(s).getDeviceType().equals("3")){
                detectorList.add(pressureFlows.get(s));
            }
        }
        //创建下级数据list数组
        List<SubordinateEquipmentList> subordinateEquipmentLists=new ArrayList<>();
        /**循环三次  每次代表 1压力表  2流量计  3探测器*/
        for (int t=0;t<3;t++){
            SubordinateEquipmentList subordinateEquipmentList=new SubordinateEquipmentList();
            if (t==0){  /**添加压力表数据*/
                if (pressureList.size()!=0){
                    /**查询下级在线设备数量*/
                    int onLine = iPipeInterfaceService.selectOnlineQuantity(pressureList, 0);
                    subordinateEquipmentList.setOnlineEquipment(onLine);
                    /**查询下级离线设备数量*/
                    int offLine = iPipeInterfaceService.selectOnlineQuantity(pressureList, 1);
                    subordinateEquipmentList.setOfflineEquipment(offLine);
                    /**查询历史报警数量*/
                    int historicalAlarm = iPipeInterfaceService.selectHistoricalAlarm(pressureList);
                    subordinateEquipmentList.setHistoricalAlarm(historicalAlarm);
                    /**查询已处理报警*/
                    int processAlarm = iPipeInterfaceService.selectProcessAlarm(pressureList);
                    subordinateEquipmentList.setAlarmProcessed(processAlarm);
                    /**查询报警中*/
                    int inAlarm = iPipeInterfaceService.selectInAlarm(pressureList);
                    subordinateEquipmentList.setInAlarm(inAlarm);
                    subordinateEquipmentList.setNumberPressureGauges(pressureList.size());
                }
                subordinateEquipmentList.setDataType(1);
            }else if (t==1){  /**添加流量计数据*/
                if (flowmeterList.size()!=0){
                    /**查询下级在线设备数量*/
                    int onLine = iPipeInterfaceService.selectOnlineQuantity(flowmeterList, 0);
                    subordinateEquipmentList.setOnlineEquipment(onLine);
                    /**查询下级离线设备数量*/
                    int offLine = iPipeInterfaceService.selectOnlineQuantity(flowmeterList, 1);
                    subordinateEquipmentList.setOfflineEquipment(offLine);
                    /**查询历史报警数量*/
                    int historicalAlarm = iPipeInterfaceService.selectHistoricalAlarm(flowmeterList);
                    subordinateEquipmentList.setHistoricalAlarm(historicalAlarm);
                    /**查询已处理报警*/
                    int processAlarm = iPipeInterfaceService.selectProcessAlarm(flowmeterList);
                    subordinateEquipmentList.setAlarmProcessed(processAlarm);
                    /**查询报警中*/
                    int inAlarm = iPipeInterfaceService.selectInAlarm(flowmeterList);
                    subordinateEquipmentList.setInAlarm(inAlarm);
                    subordinateEquipmentList.setNumberPressureGauges(flowmeterList.size());
                }
                subordinateEquipmentList.setDataType(2);
            }else if (t==2){  /**添加探测器数据*/
                if (detectorList.size()!=0){
                    /**查询下级在线设备数量*/
                    int onLine = iPipeInterfaceService.selectOnlineQuantity(detectorList, 0);
                    subordinateEquipmentList.setOnlineEquipment(onLine);
                    /**查询下级离线设备数量*/
                    int offLine = iPipeInterfaceService.selectOnlineQuantity(detectorList, 1);
                    subordinateEquipmentList.setOfflineEquipment(offLine);
                    /**查询历史报警数量*/
                    int historicalAlarm = iPipeInterfaceService.selectHistoricalAlarm(detectorList);
                    subordinateEquipmentList.setHistoricalAlarm(historicalAlarm);
                    /**查询已处理报警*/
                    int processAlarm = iPipeInterfaceService.selectProcessAlarm(detectorList);
                    subordinateEquipmentList.setAlarmProcessed(processAlarm);
                    /**查询报警中*/
                    int inAlarm = iPipeInterfaceService.selectInAlarm(detectorList);
                    subordinateEquipmentList.setInAlarm(inAlarm);
                    subordinateEquipmentList.setNumberPressureGauges(detectorList.size());
                }
                subordinateEquipmentList.setDataType(3);
            }
            subordinateEquipmentLists.add(subordinateEquipmentList);
        }
        DeviceData deviceData=new DeviceData();
        deviceData.setSubordinateEquipmentList(subordinateEquipmentLists);
        DeviceList.add(deviceData);
        deviceList.setData(DeviceList);

        return deviceList;
    }

    @Override
    public List<TDeviceInfo> selectDeviceList(TDeviceInfo tDeviceInfo)
    {
        return tDeviceInfoMapper.selectDeviceList(tDeviceInfo);
    }


    /**
     * 新增设备信息
     *
     * @param tDeviceInfo 设备信息
     * @return 结果
     */
    @Override
    public int insertTDeviceInfo(TDeviceInfo tDeviceInfo)
    {
        tDeviceInfo.setCreateTime(DateUtils.getNowDate());
        return tDeviceInfoMapper.insertTDeviceInfo(tDeviceInfo);
    }

    /**
     * 修改设备信息
     *
     * @param tDeviceInfo 设备信息
     * @return 结果
     */
    @Override
    public int updateTDeviceInfo(TDeviceInfo tDeviceInfo)
    {
        tDeviceInfo.setUpdateTime(DateUtils.getNowDate());
        return tDeviceInfoMapper.updateTDeviceInfo(tDeviceInfo);
    }

    /**
     * 批量删除设备信息
     *
     * @param deviceIds 需要删除的设备信息ID
     * @return 结果
     */
    @Override
    public int deleteTDeviceInfoByIds(Long[] deviceIds)
    {
        return tDeviceInfoMapper.deleteTDeviceInfoByIds(deviceIds);
    }

    /**
     * 删除设备信息信息
     *
     * @param deviceId 设备信息ID
     * @return 结果
     */
    @Override
    public int deleteTDeviceInfoById(Long deviceId)
    {
        return tDeviceInfoMapper.deleteTDeviceInfoById(deviceId);
    }

    /**
     * 添加关联设备信息表数据
     * @param gettDeviceInfoS
     */
    @Override
    public void insertDeviceDetailInfo(TDeviceInfoS gettDeviceInfoS) {
        tDeviceInfoMapper.insertDeviceDetailInfo(gettDeviceInfoS);
    }

    /**
     * 获取设备详细信息列表
     * @param deviceId
     * @return
     */
    @Override
    public List<TDeviceInfoS> getdeviceDetailInfo(Long deviceId) {
        List<TDeviceInfoS> tDeviceInfoS = tDeviceInfoMapper.getdeviceDetailInfo(deviceId);
        return tDeviceInfoS;
    }

    /**
     * 查询无绑定的 关联设备信息
     * @return
     */
    @Override
    public List<TDeviceInfoS> selectDetailInfo(TDeviceInfoS tDeviceInfos) {
        List<TDeviceInfoS> tDeviceInfoS = tDeviceInfoMapper.selectDetailInfo(tDeviceInfos);
        return tDeviceInfoS;
    }

    /**
     * 关联设备数据删除接口
     * @param deviceIds
     */
    @Override
    public void deleteDetailInfo(Long[] deviceIds) {
        tDeviceInfoMapper.deleteDetailInfo(deviceIds);
    }

    /**
     * 关联设备数据删除接口 单条删除
     * @param deviceId
     */
    @Override
    public void deleteDetailinfOS(int deviceId) {
        tDeviceInfoMapper.deleteDetailinfOS(deviceId);
    }

    /**
     * 将关联设备信息与设备进行绑定
     * @param gettDeviceInfoS
     */
    @Override
    public void updatetRelationDeviceDetailInfo(@Param("gettDeviceInfoS")List<TDeviceInfoS> gettDeviceInfoS,@Param("id") Long id,@Param("relationDevicetype") String relationDevicetype) {
        tDeviceInfoMapper.updatetRelationDeviceDetailInfo(gettDeviceInfoS,id,relationDevicetype);
    }

    /**
     * 查询设备已经关联的关联设备
     * @param id
     * @return
     */
    @Override
    public List<TDeviceInfoS> selectDetailInfoList(@Param("id") int id,@Param("relationDeviceType")String relationDeviceType) {
        List<TDeviceInfoS> tDeviceInfoS = tDeviceInfoMapper.selectDetailInfoList(id,relationDeviceType);
        return tDeviceInfoS;
    }

    /**
     * 解绑 设备与关联设备关系
     * @param deviceId
     */
    @Override
    public void deleteDeviceDetailInfo(int deviceId) {
        tDeviceInfoMapper.deleteDeviceDetailInfo(deviceId);
    }
    /**
     * 查询设备数量
     * @return
     */
    @Override
    public Map<String,Object> selectDeviceNum(String enterpriseId){
        return tDeviceInfoMapper.selectDeviceNum(enterpriseId.split(","));
    }
}