package com.njcn.prepare.harmonic.service.mysql.dim.impl;

import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
import com.njcn.device.biz.pojo.dto.DeptGetChildrenMoreDTO;
import com.njcn.harmonic.pojo.po.dim.RDimBusStationEventStartisDPO;
import com.njcn.harmonic.pojo.po.dim.RDimBusbarHarmnicDPO;
import com.njcn.harmonic.pojo.po.dim.RDimStationHarmnicDPO;
import com.njcn.prepare.harmonic.mapper.mysql.dim.RDimBusStationEventStartisDPOMapper;
import com.njcn.prepare.harmonic.pojo.bo.CalculatedParam;
import com.njcn.prepare.harmonic.service.mysql.dim.RDimBusStationEventStartisDPOService;
import com.njcn.prepare.harmonic.service.mysql.dim.RDimBusbarHarmnicDPOService;
import com.njcn.prepare.harmonic.service.mysql.dim.RDimStationHarmnicDPOService;
import com.njcn.system.api.DicDataFeignClient;
import com.njcn.system.enums.DicDataEnum;
import com.njcn.system.enums.DicDataTypeEnum;
import com.njcn.system.pojo.po.DictData;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 
 * Description:
 * Date: 2023/11/27  15:09【需求编号】
 *
 * @author clam
 * @version V1.0.0
 */
@Service
@RequiredArgsConstructor
public class RDimBusStationEventStartisDPOServiceImpl extends MppServiceImpl<RDimBusStationEventStartisDPOMapper, RDimBusStationEventStartisDPO> implements RDimBusStationEventStartisDPOService{

    private final RDimBusbarHarmnicDPOService rDimBusbarHarmnicDPOService;
    private final RDimStationHarmnicDPOService rDimStationHarmnicDPOService;
    private final DicDataFeignClient dicDataFeignClient;

    @Override
    public void handleDay(CalculatedParam<DeptGetChildrenMoreDTO> calculatedParam) {

        List<RDimBusStationEventStartisDPO> poList = new ArrayList<>();
        LocalDate date = LocalDate.parse(calculatedParam.getDataDate());
        List<DictData> eventStatis = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.EVENT_STATIS.getCode()).getData();


        for (DeptGetChildrenMoreDTO deptGetChildrenMoreDTO : calculatedParam.getIdList()) {
            LambdaQueryWrapper<RDimBusbarHarmnicDPO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
            lambdaQueryWrapper.eq(RDimBusbarHarmnicDPO::getOrgId,deptGetChildrenMoreDTO.getUnitId())
                    .eq(RDimBusbarHarmnicDPO::getStatisDate,date)
                    .eq(RDimBusbarHarmnicDPO::getLevel,1);
            List<RDimBusbarHarmnicDPO> rDimBusbarHarmnicDPOList = rDimBusbarHarmnicDPOService.list(lambdaQueryWrapper);
            List<RDimStationHarmnicDPO> rDimStationHarmnicDPOList = rDimStationHarmnicDPOService.lambdaQuery().eq(RDimStationHarmnicDPO::getOrgId, deptGetChildrenMoreDTO.getUnitId())
                    .eq(RDimStationHarmnicDPO::getStatisDate, date)
                    .eq(RDimStationHarmnicDPO::getLevel, 1).list();

            //暂态
            eventStatis.forEach(dictData -> {
                if (Objects.equals(dictData.getCode(), DicDataEnum.DISTURBANCE.getCode())
                        || Objects.equals(dictData.getCode(), DicDataEnum.OTHER.getCode())
                        || Objects.equals(dictData.getCode(), DicDataEnum.RECORDING_WAVE.getCode())
                        || Objects.equals(dictData.getCode(), DicDataEnum.TOTAL_INDICATORS.getCode())) {
                    return;
                }
                RDimBusStationEventStartisDPO rDimBusStationEventStartisDPO = new RDimBusStationEventStartisDPO();
                rDimBusStationEventStartisDPO.setOrgId(deptGetChildrenMoreDTO.getUnitId());
                rDimBusStationEventStartisDPO.setStatisDate(date);
                rDimBusStationEventStartisDPO.setStartisType(dictData.getId());


                List<RDimBusbarHarmnicDPO> rDimBusbarHarmnicDPOListBytag = rDimBusbarHarmnicDPOList.stream().filter(temp -> Objects.equals(temp.getTargetType(), dictData.getId())).collect(Collectors.toList());
                List<RDimStationHarmnicDPO> rDimStationHarmnicDPOListBytag = rDimStationHarmnicDPOList.stream().filter(temp -> Objects.equals(temp.getTargetType(), dictData.getId())).collect(Collectors.toList());
                if(CollUtil.isEmpty(rDimBusbarHarmnicDPOListBytag)){
                    rDimBusStationEventStartisDPO.setLimitRate(0.00);
                    rDimBusStationEventStartisDPO.setLimitFreq(0.00);
                }else {
                    long allBus = rDimBusbarHarmnicDPOListBytag.stream().map(RDimBusbarHarmnicDPO::getBusbarId).distinct().count();
                    List<RDimBusbarHarmnicDPO> limitBus = rDimBusbarHarmnicDPOListBytag.stream().filter(item->item.getLimitCount()>0).collect(Collectors.toList());

                    long limit = rDimBusbarHarmnicDPOListBytag.stream().map(RDimBusbarHarmnicDPO::getBusbarId).distinct().count();
                    rDimBusStationEventStartisDPO.setLimitRate(Double.valueOf((float)limit/allBus));

                    int sum = limitBus.stream().mapToInt(RDimBusbarHarmnicDPO::getLimitCount).sum();
                    rDimBusStationEventStartisDPO.setLimitFreq(Double.valueOf((float)sum/allBus));

                }
                if(CollUtil.isEmpty(rDimStationHarmnicDPOListBytag)){
                    rDimBusStationEventStartisDPO.setStationFreq(0.00);
                    rDimBusStationEventStartisDPO.setStationLimitRate(0.00);
                }else {
                    long allBus = rDimStationHarmnicDPOListBytag.stream().map(RDimStationHarmnicDPO::getStationId).distinct().count();
                    List<RDimStationHarmnicDPO> limitstation = rDimStationHarmnicDPOListBytag.stream().filter(item->item.getLimitCount()>0).collect(Collectors.toList());

                    long limit = rDimStationHarmnicDPOListBytag.stream().map(RDimStationHarmnicDPO::getStationId).distinct().count();
                    rDimBusStationEventStartisDPO.setLimitRate(Double.valueOf((float)limit/allBus));

                    int sum = limitstation.stream().mapToInt(RDimStationHarmnicDPO::getLimitCount).sum();
                    rDimBusStationEventStartisDPO.setLimitFreq(Double.valueOf((float)sum/allBus));

                }

                poList.add(rDimBusStationEventStartisDPO);

            });


        }
        if (!CollectionUtils.isEmpty(poList) ) {
            this.saveOrUpdateBatchByMultiId(poList,500);
        }





    }
}
