package cn.cecep.talroad.data.analyse.task.real.device.impl;

import cn.cecep.talroad.data.analyse.task.entity.MainProductDeviceVo;
import cn.cecep.talroad.data.analyse.task.real.device.DeviceRealService;
import cn.cecep.talroad.domain.OdsInorganizationWeiStationHourI;
import cn.cecep.talroad.enums.PollutantTypeEnum;
import cn.cecep.talroad.mapper.BMainProductionInorgGasMapper;
import cn.cecep.talroad.mapper.OdsInorganizationWeiStationHourIMapper;
import cn.cecep.talroad.util.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

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

@Service
public class OdsDataDeviceRealService extends DeviceRealService<OdsInorganizationWeiStationHourI> {

    @Autowired
    private BMainProductionInorgGasMapper bMainProductionInorgGasMapper;

    @Autowired
    private OdsInorganizationWeiStationHourIMapper odsInorganizationWeiStationHourIMapper;

    @Override
    public List<OdsInorganizationWeiStationHourI> queryReal(List<String> deviceIds, Date startTime, Date endTime) {

        List<MainProductDeviceVo> mainProductDeviceVos = MainProductDeviceVo.parse(deviceIds);

        List<String> stationIds = mainProductDeviceVos.stream().map(MainProductDeviceVo::getOutletId).collect(Collectors.toList());

        if (CollectionUtils.isEmpty(stationIds)){
            return new ArrayList<>();
        }
        LambdaQueryWrapper<OdsInorganizationWeiStationHourI> sEnvGasRealLambdaQueryWrapper = new QueryWrapper<OdsInorganizationWeiStationHourI>().lambda()
                .in(OdsInorganizationWeiStationHourI::getStationId, stationIds)
                .ge(OdsInorganizationWeiStationHourI::getReceiveTime, DateUtil.format(startTime,"yyyy-MM-dd HH:mm:ss"))
                .le(OdsInorganizationWeiStationHourI::getReceiveTime, DateUtil.format(endTime,"yyyy-MM-dd HH:mm:ss"));

        List<OdsInorganizationWeiStationHourI> sEnvGasMonReals = odsInorganizationWeiStationHourIMapper.selectList(sEnvGasRealLambdaQueryWrapper);

        return sEnvGasMonReals;
    }

    @Override
    public List<String> queryDeviceIds() {
        List<MainProductDeviceVo> deviceIdsData = bMainProductionInorgGasMapper.selectDeviceIdByPollutantType(PollutantTypeEnum.ONLINE_MONITORING.getCode());

        deviceIdsData = MainProductDeviceVo.groupDevice(deviceIdsData);

        return MainProductDeviceVo.toJsonString(deviceIdsData);
    }

    @Override
    public Map<String, List<OdsInorganizationWeiStationHourI>> groupDeviceRealList(List<OdsInorganizationWeiStationHourI> dataReal,List<String> deviceIds) {
        List<MainProductDeviceVo> mainProductDeviceVos = MainProductDeviceVo.parse(deviceIds);

        Map<String, List<OdsInorganizationWeiStationHourI>> groupData = new HashMap<>();

        for (OdsInorganizationWeiStationHourI sEnvWaterMonReal : dataReal) {

            String outletId = sEnvWaterMonReal.getStationId();

            List<String> proDeviceIds = mainProductDeviceVos.stream()
                    .filter(mainProductDeviceVo -> mainProductDeviceVo.getOutletId().equals(outletId))
                    .map(MainProductDeviceVo::getProFacilityId).collect(Collectors.toList());

            for (String proDeviceId : proDeviceIds) {
                List<OdsInorganizationWeiStationHourI> sEnvWaterMonReals = groupData.get(proDeviceId);
                if (sEnvWaterMonReals==null){
                    sEnvWaterMonReals = new ArrayList<>();
                    groupData.put(proDeviceId,sEnvWaterMonReals);
                }
                sEnvWaterMonReals.add(sEnvWaterMonReal);
            }

        }

        return groupData;
    }

    @Override
    public String getLogicExceptionsDate(OdsInorganizationWeiStationHourI entity) {
        return entity.getReceiveTime();
    }
}
