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.SEnvGasMonReal;
import cn.cecep.talroad.enums.PollutantTypeEnum;
import cn.cecep.talroad.mapper.BMainProductionOrganizGasMapper;
import cn.cecep.talroad.mapper.SEnvGasMonRealMapper;
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 GasDataDeviceRealService extends DeviceRealService<SEnvGasMonReal> {

    @Autowired
    private BMainProductionOrganizGasMapper bMainProductionOrganizGasMapper;

    @Autowired
    private SEnvGasMonRealMapper sEnvGasMonRealMapper;

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

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

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

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

        List<SEnvGasMonReal> sEnvGasMonReals = sEnvGasMonRealMapper.selectList(sEnvGasRealLambdaQueryWrapper);

        return sEnvGasMonReals;
    }

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

        deviceIdsData = MainProductDeviceVo.groupDevice(deviceIdsData);

        return MainProductDeviceVo.toJsonString(deviceIdsData);
    }

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

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

        for (SEnvGasMonReal sEnvWaterMonReal : dataReal) {

            String outletId = sEnvWaterMonReal.getOutletId();

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

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

        }

        return groupData;
    }

    @Override
    public String getLogicExceptionsDate(SEnvGasMonReal entity) {
        return entity.getMonitoringTime();
    }
}
