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

import cn.cecep.talroad.common.core.utils.DateUtils;
import cn.cecep.talroad.common.core.utils.StringUtils;
import cn.cecep.talroad.common.core.utils.bean.BeanUtils;
import cn.cecep.talroad.common.core.web.domain.AjaxResult;
import cn.cecep.talroad.domain.AmProblemFi;
import cn.cecep.talroad.domain.BasDevice;
import cn.cecep.talroad.domain.BasDeviceParam;
import cn.cecep.talroad.domain.BasDeviceSalAnalysis;
import cn.cecep.talroad.domain.BasParam;
import cn.cecep.talroad.domain.MonDevBlReal;
import cn.cecep.talroad.domain.MonDevDlReal;
import cn.cecep.talroad.domain.PcFactory;
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.service.IBasParamService;
import cn.cecep.talroad.service.IMonDevDlRealService;
import cn.cecep.talroad.service.strategy.AbstractStrategyAdapter;
import cn.cecep.talroad.service.strategy.StatusStrategyAdapter;
import cn.cecep.talroad.util.MathUtils;
import cn.cecep.talroad.vo.BasDeviceParamVo;
import cn.cecep.talroad.vo.FactoryDeviceVo;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
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-27 19:26
 * @Class: DlGulAdapter
 * @Deseription:
 * @Version V1.0
 */
@Slf4j
@Service("DLGUL")
public class DlGulAdapter extends StatusStrategyAdapter {

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

    @Override
    protected void doProcessStatus(String industry, String deviceType,Date curr) {
        List<BasDeviceSalAnalysis> deviceStatusList = new ArrayList<>();
        List<SRaRealTimeAnalysisRun> runList = new ArrayList<>();
        List<SRaRealTimeAnalysisRunOne> runOneList = new ArrayList<>();
        List<AmProblemFi> alarmList = new ArrayList<>();

        Date lastHour = DateUtils.addMinutes(curr, -15);
        List<MonDevDlReal> realList = monDevDlRealService.selectLatestByParams(industry,deviceType, lastHour,curr);
        if(realList!=null&&realList.size()>0){
            realList.forEach(real->{
                AtomicInteger m = new AtomicInteger();
                AtomicInteger n = new AtomicInteger();

                // 根据设备ID，查询企业名称、设备名称等信息
                FactoryDeviceVo vo = basDeviceService.selectFactoryDeviceVoByDeviceId(real.getDeviceId());

                SRaRealTimeAnalysisRunOne oldDeviceStatus = super.getOldDeviceStatus(vo.getFactoryId(),vo.getDeviceId());
                List<BasDeviceParamVo> paramsList = basDeviceParamService.selectBasDeviceParamByCondition(real.getDeviceId(), Arrays.asList("g903","hs101"));
                if(real.getG905()!=null) {
                    // 引风机状态
                    m.getAndIncrement();
                    // 引风机状态为0为停机
                    if (Double.valueOf(real.getG905()).compareTo(0.0)==0) {
                        n.getAndIncrement();
                    }
                }
                if(paramsList!=null && paramsList.size()>0) {
                    paramsList.forEach(p -> {
                        if ("g903".equalsIgnoreCase(p.getParamCodeSvc()) && StringUtils.isNotEmpty(real.getG903())) {
                            // 锅炉燃料给料量
                            m.getAndIncrement();
                            if (Double.valueOf(real.getG903()) <= p.getNormalValue().multiply(new BigDecimal(0.1)).setScale(2, RoundingMode.HALF_UP).doubleValue()) {
                                n.getAndIncrement();
                            }
                        } else if ("hs101".equalsIgnoreCase(p.getParamCodeSvc()) && StringUtils.isNotEmpty(real.getHs101())) {
                            // 发机侧锅炉蒸发量
                            m.getAndIncrement();
                            if (Double.valueOf(real.getHs101()) <= p.getNormalValue().multiply(new BigDecimal(0.1)).setScale(2, RoundingMode.HALF_UP).doubleValue()) {
                                n.getAndIncrement();
                            }
                        }
                    });
                }
                // 数据缺失超过一条
                if (m.get() < 2) {
                    // 数据缺失无法判断

                } else {
                    // false为大于66%
                    if (!MathUtils.divideSjj(n.get(), m.get())) {
                       //停产条件比例占比超过66%，设备停机
                        SRaRealTimeAnalysisRun run = super.doProcessDeviceRunStatus(vo,lastHour,curr,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(lastHour, curr, "");
                            StringBuffer sb = new StringBuffer();
                            sb.append(vo.getFactoryName()).append(vo.getDeviceName())
                                .append("于").append(runEtc).append("存在启停行为，请注意。");
                            AmProblemFi problemFi = super.doProcessAlaram(vo.getFactoryId(),vo.getDeviceId(),  vo.getDeviceName(), lastHour,curr, ProblemTypeEnum.STOP_RUN,sb.toString(),"锅炉燃料给料量,发机侧锅炉蒸发量,引风机状态","g903,hs101,g905");
                            alarmList.add(problemFi);
                        }
                    } else {
                        //设备未停机
                        SRaRealTimeAnalysisRun run = super.doProcessDeviceRunStatus(vo,lastHour,curr,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(lastHour, curr, "");
                            StringBuffer sb = new StringBuffer();
                            sb.append(vo.getFactoryName()).append(vo.getDeviceName())
                                .append("于").append(runEtc).append("存在启停行为，请注意。");
                            AmProblemFi problemFi = super.doProcessAlaram(vo.getFactoryId(),vo.getDeviceId(),  vo.getDeviceName(), lastHour,curr, ProblemTypeEnum.STOP_RUN,sb.toString(),"锅炉燃料给料量,发机侧锅炉蒸发量,引风机状态","g903,hs101,g905");
                            alarmList.add(problemFi);
                        }
                    }
                }
            });
            //批量保存
            super.doSaveBatchAnalysisRunStatus(runList);
            super.doSaveBatchAnalysisRunOneStatus(runOneList);
            super.doSaveOrUpdateBatchDeviceStatus(deviceStatusList);
            super.doSaveBatchAlarm(alarmList);
        }
    }
}
