package cn.cecep.talroad.service.strategy.support.gt;

import cn.cecep.talroad.common.core.utils.StringUtils;
import cn.cecep.talroad.common.core.utils.bean.BeanUtils;
import cn.cecep.talroad.domain.AmProblemFi;
import cn.cecep.talroad.domain.BasDeviceSalAnalysis;
import cn.cecep.talroad.domain.MonDevReal;
import cn.cecep.talroad.domain.SRaRealTimeAnalysisRunOne;
import cn.cecep.talroad.domain.analysis.SRaRealTimeAnalysisRun;
import cn.cecep.talroad.enums.DeviceStatusEnum;
import cn.cecep.talroad.enums.JudgeEnum;
import cn.cecep.talroad.enums.ProblemTypeEnum;
import cn.cecep.talroad.service.IBasDeviceParamService;
import cn.cecep.talroad.service.IBasDeviceService;
import cn.cecep.talroad.util.MathUtils;
import cn.cecep.talroad.vo.BasDeviceParamVo;
import cn.cecep.talroad.vo.FactoryDeviceVo;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @Auther: cjh
 * @Date: 2023-03-25 16:09
 * @Class: GtGlAdapter
 * @Deseription:
 * @Version V1.0
 */
@Slf4j
@Service("GTGL")
public class GtGlAdapter extends GtStatusStrategyAdapter {

    @Autowired
    private IBasDeviceParamService basDeviceParamService;
    @Autowired
    private IBasDeviceService basDeviceService;

    @Override
    protected void doProcessGTStatus(String industry, String deviceType, List<MonDevReal> list,Date lastDate,Date tempDate) {

        List<BasDeviceSalAnalysis> deviceStatusList = new ArrayList<>();
        List<SRaRealTimeAnalysisRun> runList = new ArrayList<>();
        List<SRaRealTimeAnalysisRunOne> runOneList = new ArrayList<>();
        List<AmProblemFi> alarmList = new ArrayList<>();
        // 监测数据不为空
        if (list != null && list.size() > 0) {
            list.forEach(real -> {
                AtomicInteger m = new AtomicInteger();
                AtomicInteger n = new AtomicInteger();
                // 查询设备参数
                List<BasDeviceParamVo> paramsList = basDeviceParamService.selectBasDeviceParamByCondition(real.getDeviceId(),Arrays.asList("p1","p2", "p4", "g930","g932"));
                // 设备参数不为空
                if (paramsList != null && paramsList.size() > 0) {

                    // 根据设备ID，查询企业名称、设备名称等信息
                    FactoryDeviceVo vo = basDeviceService.selectFactoryDeviceVoByDeviceId(real.getDeviceId());
                    SRaRealTimeAnalysisRunOne oldDeviceStatus = super.getOldDeviceStatus(vo.getFactoryId(),vo.getDeviceId());
                    paramsList.forEach(p -> {
                        if ("p1".equalsIgnoreCase(p.getParamCodeSvc()) && StringUtils.isNotEmpty(real.getP1())) {
                            // 顶压
                            m.getAndIncrement();
                            if (Double.valueOf(real.getP1()) <= p.getNormalValue().multiply(new BigDecimal(0.1)).setScale(2, RoundingMode.HALF_UP).doubleValue()) {
                                n.getAndIncrement();
                            }
                        } else if ("p2".equalsIgnoreCase(p.getParamCodeSvc()) && StringUtils.isNotEmpty(real.getP2())) {
                            // 风压
                            m.getAndIncrement();
                            if (Double.valueOf(real.getP2()) <= p.getNormalValue().multiply(new BigDecimal(0.1)).setScale(2, RoundingMode.HALF_UP).doubleValue()) {
                                n.getAndIncrement();
                            }
                        } else if ("p4".equalsIgnoreCase(p.getParamCodeSvc()) && StringUtils.isNotEmpty(real.getP4())) {
                            // 动力鼓风机风量
                            m.getAndIncrement();
                            if (Double.valueOf(real.getP4()) <= p.getNormalValue().multiply(new BigDecimal(0.1)).setScale(2, RoundingMode.HALF_UP).doubleValue()) {
                                n.getAndIncrement();
                            }
                        } else if ("g930".equalsIgnoreCase(p.getParamCodeSvc()) && StringUtils.isNotEmpty(real.getG930())) {
                            // 热风炉鼓风量
                            m.getAndIncrement();
                            if (Double.valueOf(real.getG930()) <= p.getNormalValue().multiply(new BigDecimal(0.1)).setScale(2, RoundingMode.HALF_UP).doubleValue()) {
                                n.getAndIncrement();
                            }
                        } else if ("g932".equalsIgnoreCase(p.getParamCodeSvc()) && StringUtils.isNotEmpty(real.getG932())) {
                            // 煤气使用量
                            m.getAndIncrement();
                            if (Double.valueOf(real.getG932()) <= p.getNormalValue().multiply(new BigDecimal(0.1)).setScale(2, RoundingMode.HALF_UP).doubleValue()) {
                                n.getAndIncrement();
                            }
                        }
                    });
                    //数据缺失2种以上
                    if (m.get()>=2) {
                        // false为大于66%
                        if (!MathUtils.divideSjj(n.get(), m.get())) {
                            //停产条件比例占比超过66%，设备停机
                            SRaRealTimeAnalysisRun run = super.doProcessDeviceRunStatus(vo,lastDate,tempDate,oldDeviceStatus,DeviceStatusEnum.STOP, JudgeEnum.GKSJ);
                            runList.add(run);
                            if(oldDeviceStatus!=null) {
                                String oneId = "";
                                if(StringUtils.isNotEmpty(oldDeviceStatus.getDataId())) {
                                    oneId = oldDeviceStatus.getDataId();
                                }
                                BeanUtils.copyProperties(run, oldDeviceStatus);
                                oldDeviceStatus.setDataId(oneId);
                                oldDeviceStatus.setIndustryPermissionName(vo.getIndustryPermissionName());
                                runOneList.add(oldDeviceStatus);
                            }

                            BasDeviceSalAnalysis basStatus = super.doProcessDeviceAnalysisStatus(vo.getFactoryId(),vo.getDeviceId(),DeviceStatusEnum.STOP.getValue(),"");
                            deviceStatusList.add(basStatus);
                            if(DeviceStatusEnum.STOP_RUN.getCode().equals(run.getOperationStatus())||DeviceStatusEnum.RUN_STOP.getCode().equals(run.getOperationStatus())) {
                                String runEtc = super.getRunEtc(lastDate, tempDate, "");
                                StringBuffer sb = new StringBuffer();
                                sb.append(vo.getFactoryName()).append(vo.getDeviceName())
                                    .append("于").append(runEtc).append("存在启停行为，请注意。");
                                AmProblemFi problemFi = doProcessAlaram(vo.getFactoryId(),vo.getDeviceId(),  vo.getDeviceName(), lastDate, tempDate, ProblemTypeEnum.STOP_RUN,sb.toString(),"顶压,风压,动力鼓风机风量,热风炉鼓风量,煤气使用量","p1,p2,p4,g930,g932");
                                alarmList.add(problemFi);
                            }
                        } else {
                            //停产条件比例占比未超过66%，设备未停机
                            SRaRealTimeAnalysisRun run = super.doProcessDeviceRunStatus(vo,lastDate,tempDate,oldDeviceStatus, DeviceStatusEnum.RUN, JudgeEnum.GKSJ);
                            runList.add(run);
                            if(oldDeviceStatus!=null) {
                                String oneId = "";
                                if(StringUtils.isNotEmpty(oldDeviceStatus.getDataId())) {
                                    oneId = oldDeviceStatus.getDataId();
                                }
                                BeanUtils.copyProperties(run, oldDeviceStatus);
                                oldDeviceStatus.setDataId(oneId);
                                oldDeviceStatus.setIndustryPermissionName(vo.getIndustryPermissionName());
                                runOneList.add(oldDeviceStatus);
                            }
                            BasDeviceSalAnalysis basStatus = super.doProcessDeviceAnalysisStatus(vo.getFactoryId(),vo.getDeviceId(),DeviceStatusEnum.RUN.getValue(),"");
                            deviceStatusList.add(basStatus);
                            if(DeviceStatusEnum.STOP_RUN.getCode().equals(run.getOperationStatus())||DeviceStatusEnum.RUN_STOP.getCode().equals(run.getOperationStatus())) {
                                String runEtc = super.getRunEtc(lastDate, tempDate, "");
                                StringBuffer sb = new StringBuffer();
                                sb.append(vo.getFactoryName()).append(vo.getDeviceName())
                                    .append("于").append(runEtc).append("存在启停行为，请注意。");
                                AmProblemFi problemFi = doProcessAlaram(vo.getFactoryId(),vo.getDeviceId(),  vo.getDeviceName(), lastDate, tempDate, ProblemTypeEnum.STOP_RUN,sb.toString(),"顶压,风压,动力鼓风机风量,热风炉鼓风量,煤气使用量","p1,p2,p4,g930,g932");
                                alarmList.add(problemFi);
                            }
                        }
                    }
                }
            });
            //批量保存
            super.doSaveBatchAnalysisRunStatus(runList);
            super.doSaveBatchAnalysisRunOneStatus(runOneList);
            super.doSaveOrUpdateBatchDeviceStatus(deviceStatusList);
            super.doSaveBatchAlarm(alarmList);
        }
    }
}
