package com.zehong.system.service.impl;

import com.github.pagehelper.PageInfo;
import com.zehong.common.core.domain.entity.SysDictData;
import com.zehong.common.utils.DateUtils;
import com.zehong.common.utils.PageInfoUtil;
import com.zehong.common.utils.StringUtils;
import com.zehong.system.domain.TDeviceAlarm;
import com.zehong.system.domain.TDeviceInfo;
import com.zehong.system.domain.TDeviceReportData;
import com.zehong.system.domain.TPipe;
import com.zehong.system.domain.form.DeviceAlarmForm;
import com.zehong.system.domain.vo.DeviceAlarmVo;
import com.zehong.system.mapper.TDeviceAlarmMapper;
import com.zehong.system.mapper.TDeviceInfoMapper;
import com.zehong.system.mapper.TDeviceReportDataMapper;
import com.zehong.system.mapper.TPipeMapper;
import com.zehong.system.service.ISysDictTypeService;
import com.zehong.system.service.ITDeviceAlarmService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * 报警信息Service业务层处理
 * 
 * @author zehong
 * @date 2021-07-21
 */
@Service
public class TDeviceAlarmServiceImpl implements ITDeviceAlarmService 
{
    @Autowired
    private TDeviceAlarmMapper tDeviceAlarmMapper;
    @Autowired
    private TDeviceInfoMapper tDeviceInfoMapper;
    @Autowired
    private TPipeMapper tPipeMapper;
    @Autowired
    private TDeviceReportDataMapper tDeviceReportDataMapper;

    @Autowired
    private ISysDictTypeService iSysDictTypeService;

    /**
     * 查询报警信息
     * 
     * @param alarmId 报警信息ID
     * @return 报警信息
     */
    @Override
    public DeviceAlarmVo selectTDeviceAlarmById(int alarmId) throws Exception
    {
        DeviceAlarmVo deviceAlarmVo = new DeviceAlarmVo();
        TDeviceAlarm tDeviceAlarm = tDeviceAlarmMapper.selectTDeviceAlarmById(alarmId);
        BeanUtils.copyProperties(tDeviceAlarm, deviceAlarmVo);

        if (StringUtils.isNotEmpty(tDeviceAlarm.getAlarmType())) {
            List<SysDictData> sysDictDataList = iSysDictTypeService.selectDictDataByType("t_alarm_type");
            for (SysDictData sysDictData : sysDictDataList) {
                if (tDeviceAlarm.getAlarmType().equals(sysDictData.getDictValue())) {
                    deviceAlarmVo.setAlarmType(sysDictData.getDictLabel());
                }
            }
        }

        if (StringUtils.isNotEmpty(tDeviceAlarm.getDeviceType())) {
            List<SysDictData> sysDictDataList = iSysDictTypeService.selectDictDataByType("t_trouble_device_type");
            for (SysDictData sysDictData : sysDictDataList) {
                if (tDeviceAlarm.getDeviceType().equals(sysDictData.getDictValue())) {
                    deviceAlarmVo.setDeviceType(sysDictData.getDictLabel());
                }
            }
        }

        if("0".equals(tDeviceAlarm.getDeviceType())){
            TPipe pipe = tPipeMapper.selectTPipeById(tDeviceAlarm.getDeviceId());
            if(pipe != null) {
                deviceAlarmVo.setDeviceCode(pipe.getPipeCode());
                deviceAlarmVo.setDeviceName(pipe.getPipeName());

                List<TPipe> pipeList = new ArrayList<>();
                pipeList.add(pipe);
                deviceAlarmVo.setPipeList(pipeList);
            }
        } else {
            TDeviceInfo deviceInfo = tDeviceInfoMapper.selectTDeviceInfoById(tDeviceAlarm.getDeviceId());
            if(deviceInfo != null){
                deviceAlarmVo.setDeviceCode(deviceInfo.getDeviceCode());
                deviceAlarmVo.setDeviceName(deviceInfo.getDeviceName());

                List<TDeviceInfo> deviceList = new ArrayList<>();
                deviceList.add(deviceInfo);
                deviceAlarmVo.setDeviceList(deviceList);
            }

            // 查询当前设备开始报警时间前后一小时的数据
            TDeviceReportData tDeviceReportData = new TDeviceReportData();
            tDeviceReportData.setDeviceNum(deviceInfo.getIotNo());
            tDeviceReportData.setReportTime(tDeviceAlarm.getStartTime());

            List<TDeviceReportData> deviceReportDataList = tDeviceReportDataMapper.getAlarmDeviceReportDataList(tDeviceReportData);
            if(deviceReportDataList.size() != 0) {
                deviceAlarmVo.setDeviceReportDataList(deviceReportDataList);
            }
        }

        return deviceAlarmVo;
    }

    /**
     * 查询报警信息列表
     * 
     * @param deviceAlarmForm 报警信息
     * @return 报警信息
     */
    @Override
    public PageInfo<DeviceAlarmVo> selectTDeviceAlarmPage(DeviceAlarmForm deviceAlarmForm) throws Exception
    {
        PageInfo<TDeviceAlarm> deviceAlarmList = new PageInfo<>();

        if(deviceAlarmForm.getDeviceCode() != null){
            List<TDeviceAlarm> pipeList = tDeviceAlarmMapper.selectTDeviceAlarmByPipeCode(deviceAlarmForm);
            List<TDeviceAlarm> deviceList = tDeviceAlarmMapper.selectTDeviceAlarmByDeviceCode(deviceAlarmForm);
            setDeviceInfo(deviceAlarmList,pipeList);
            setDeviceInfo(deviceAlarmList,deviceList);
        } else {
            deviceAlarmList = new PageInfo(tDeviceAlarmMapper.selectTDeviceAlarmList(deviceAlarmForm));
        }
        PageInfo<DeviceAlarmVo> pageVo = PageInfoUtil.pageInfo2PageInfoDTO(deviceAlarmList,DeviceAlarmVo.class);
        if(pageVo.getList().size() != 0) {
            for (DeviceAlarmVo deviceAlarmVo : pageVo.getList()) {
                if ("0".equals(deviceAlarmVo.getDeviceType())) {
                    TPipe pipe = tPipeMapper.selectTPipeById(deviceAlarmVo.getDeviceId());
                    if (pipe != null) {
                        deviceAlarmVo.setDeviceCode(pipe.getPipeCode());
                        deviceAlarmVo.setDeviceName(pipe.getPipeName());

                        List<TPipe> pipeList = new ArrayList<>();
                        pipeList.add(pipe);
                        deviceAlarmVo.setPipeList(pipeList);
                    }
                } else {
                    TDeviceInfo deviceInfo = tDeviceInfoMapper.selectTDeviceInfoById(deviceAlarmVo.getDeviceId());
                    if (deviceInfo != null) {
                        deviceAlarmVo.setDeviceCode(deviceInfo.getDeviceCode());
                        deviceAlarmVo.setDeviceName(deviceInfo.getDeviceName());

                        List<TDeviceInfo> deviceList = new ArrayList<>();
                        deviceList.add(deviceInfo);
                        deviceAlarmVo.setDeviceList(deviceList);
                    }
                }

                if (StringUtils.isNotEmpty(deviceAlarmVo.getAlarmType())) {
                    List<SysDictData> sysDictDataList = iSysDictTypeService.selectDictDataByType("t_alarm_type");
                    for (SysDictData sysDictData : sysDictDataList) {
                        if (deviceAlarmVo.getAlarmType().equals(sysDictData.getDictValue())) {
                            deviceAlarmVo.setAlarmType(sysDictData.getDictLabel());
                        }
                    }
                }

                if (StringUtils.isNotEmpty(deviceAlarmVo.getDeviceType())) {
                    List<SysDictData> sysDictDataList = iSysDictTypeService.selectDictDataByType("t_trouble_device_type");
                    for (SysDictData sysDictData : sysDictDataList) {
                        if (deviceAlarmVo.getDeviceType().equals(sysDictData.getDictValue())) {
                            deviceAlarmVo.setDeviceType(sysDictData.getDictLabel());
                        }
                    }
                }
            }
        }

        return pageVo;
    }

    private void setDeviceInfo(PageInfo<TDeviceAlarm> deviceAlarmList,List<TDeviceAlarm> list){
        if(list.size() != 0){
            if(null != deviceAlarmList.getList() && !deviceAlarmList.getList().isEmpty()){
                deviceAlarmList.getList().addAll(list);
                deviceAlarmList.setTotal(deviceAlarmList.getTotal() + list.size());
            }else{
                deviceAlarmList.setList(list);
                deviceAlarmList.setTotal(list.size());
            }
        }
    }

    /**
     * 新增报警信息
     * 
     * @param tDeviceAlarm 报警信息
     * @return 结果
     */
    @Override
    public int insertTDeviceAlarm(TDeviceAlarm tDeviceAlarm)
    {
        tDeviceAlarm.setCreateTime(DateUtils.getNowDate());
        return tDeviceAlarmMapper.insertTDeviceAlarm(tDeviceAlarm);
    }

    /**
     * 修改报警信息
     * 
     * @param tDeviceAlarm 报警信息
     * @return 结果
     */
    @Override
    public int updateTDeviceAlarm(TDeviceAlarm tDeviceAlarm)
    {
        tDeviceAlarm.setUpdateTime(DateUtils.getNowDate());
        return tDeviceAlarmMapper.updateTDeviceAlarm(tDeviceAlarm);
    }

    /**
     * 批量删除报警信息
     * 
     * @param alarmIds 需要删除的报警信息ID
     * @return 结果
     */
    @Override
    public int deleteTDeviceAlarmByIds(int[] alarmIds)
    {
        return tDeviceAlarmMapper.deleteTDeviceAlarmByIds(alarmIds);
    }

    /**
     * 删除报警信息信息
     * 
     * @param alarmId 报警信息ID
     * @return 结果
     */
    @Override
    public int deleteTDeviceAlarmById(int alarmId)
    {
        return tDeviceAlarmMapper.deleteTDeviceAlarmById(alarmId);
    }

    /**
     * 查询报警设备
     * @return TDeviceAlarm
     */
    @Override
    public List<TDeviceAlarm> selectAlarmDevice (){
        return tDeviceAlarmMapper.selectAlarmDevice();
    }
}