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

import cn.cecep.talroad.data.analyse.task.entity.MainProductDeviceVo;
import cn.cecep.talroad.data.analyse.task.real.RealService;
import cn.cecep.talroad.domain.SEnvWaterMonReal;
import cn.cecep.talroad.enums.PollutantTypeEnum;
import cn.cecep.talroad.mapper.BMainProductionOrganizGasMapper;
import cn.cecep.talroad.mapper.SEnvWaterMonRealMapper;
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 WaterDataRealService extends RealService<SEnvWaterMonReal> {

    @Autowired
    private BMainProductionOrganizGasMapper bMainProductionOrganizGasMapper;

    @Autowired
    private SEnvWaterMonRealMapper envWaterMonRealMapper;


    @Override
    public List<SEnvWaterMonReal> 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<SEnvWaterMonReal> sEnvGasRealLambdaQueryWrapper = new QueryWrapper<SEnvWaterMonReal>().lambda()
                .in(SEnvWaterMonReal::getOutletId, outletIds)
                .ge(SEnvWaterMonReal::getMonitoringTime, DateUtil.format(startTime,"yyyy-MM-dd HH:mm:ss"))
                .le(SEnvWaterMonReal::getMonitoringTime, DateUtil.format(endTime,"yyyy-MM-dd HH:mm:ss"));

        List<SEnvWaterMonReal> sEnvGasMonReals = envWaterMonRealMapper.selectList(sEnvGasRealLambdaQueryWrapper);

        return sEnvGasMonReals;
    }

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

        deviceIdsData = MainProductDeviceVo.groupDevice(deviceIdsData);

        return MainProductDeviceVo.toJsonString(deviceIdsData);
    }

    @Override
    public Map<String, List<SEnvWaterMonReal>> groupDeviceRealList(List<SEnvWaterMonReal> dataReal,List<String> deviceIds) {

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

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

        for (SEnvWaterMonReal 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<SEnvWaterMonReal> sEnvWaterMonReals = groupData.get(proDeviceId);
                if (sEnvWaterMonReals==null){
                    sEnvWaterMonReals = new ArrayList<>();
                    groupData.put(proDeviceId,sEnvWaterMonReals);
                }
                sEnvWaterMonReals.add(sEnvWaterMonReal);
            }

        }

        return groupData;
    }

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