package cn.cecep.talroad.data.analyse.task.transfer.rate;

import cn.cecep.talroad.data.analyse.task.entity.SimpleSRaFactoryTransferRateAnalysis;
import cn.cecep.talroad.domain.PcLabel;
import cn.cecep.talroad.domain.PcLabelFactory;
import cn.cecep.talroad.enums.LabelValueEnum;
import cn.cecep.talroad.mapper.PcLabelFactoryMapper;
import cn.cecep.talroad.mapper.PcLabelMapper;
import cn.cecep.talroad.mapper.analysis.SRaFactoryTransferRateAnalysisMapper;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.UUID;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author hehongyu
 * @description: 打标任务
 * @date 2023/6/27 23:09
 * 逻辑描述：1.查询 s_ra_factory_transfer_rate_analysis 数据
 *          条件是 根据企业id进行分组  且avg(在线监测) and avg(分表计电) and avg(无组织) and avg(工况)
 *          特殊说明：因 该表 是存在区域和其他条件 导致 一个企业会查询到多条年报 或者 日报
 *          分表计电 和 工况 是有年报的 直接 按照 去年查询 即可 avg对应数据即可
 *          在线监测 和 无组织 只有日报 需查询所有日报 后avg对应数据
 *          2.根据查询到的 数据 对应值 进行判断  50%（含）以下，50%以上75%（含）以下，75%以上
 *          3.删除原有企业和标签的关系 重新维护
 *
 */
public abstract class TransferRateAbstractService {

    @Autowired
    private SRaFactoryTransferRateAnalysisMapper mapper;

    @Autowired
    private PcLabelFactoryMapper labelFactoryMapper;

    @Autowired
    private PcLabelMapper labelMapper;

    protected static final int PAGE_SIZE = 100;

    public boolean transferRateAnalysis(){
        List<PcLabelFactory> pcLabelFactoryList = new ArrayList<>();
        //TODO 如果企业很多的话 getDataList() 此处加入分页逻辑 分批处理
        List<SimpleSRaFactoryTransferRateAnalysis> records = getDataList();
        PcLabel label = labelMapper.selectOne(
                new QueryWrapper<PcLabel>().lambda().eq(PcLabel::getLabelCode, getLabelCode())
        );
        for (SimpleSRaFactoryTransferRateAnalysis record : records) {
            PcLabelFactory pcLabelFactory = buildPcLabelFactory(record.getFactoryId(), label.getId(), getLabelValue(record));
            pcLabelFactoryList.add(pcLabelFactory);
        }
        if (CollectionUtil.isEmpty(pcLabelFactoryList)){
            return true;
        }
        //查询对应企业 和 标签 是否存在 存在修改 不存在新增
        LambdaQueryWrapper<PcLabelFactory> wrapper = Wrappers.<PcLabelFactory>lambdaQuery()
                .in(PcLabelFactory::getFactoryId, pcLabelFactoryList.stream().map(PcLabelFactory::getFactoryId).collect(Collectors.toList()))
                .eq(PcLabelFactory::getLabelId, label.getId());
        //删除原本的对应标签 和 企业的 关联关系
        labelFactoryMapper.delete(wrapper);
        //重新添加新的企业 标签 关联关系
        if (CollectionUtil.isNotEmpty(pcLabelFactoryList)){
            labelFactoryMapper.batchSave(pcLabelFactoryList);
        }
        return true;
    }

    /**
     * 构建企业标签关联关系实体
     */
    private PcLabelFactory buildPcLabelFactory(String factoryId, String labelId, String labelValue){
        PcLabelFactory pcLabelFactory = new PcLabelFactory();
        pcLabelFactory.setId(UUID.randomUUID().toString());
        pcLabelFactory.setFactoryId(factoryId);
        pcLabelFactory.setLabelId(labelId);
        pcLabelFactory.setLabelValue(labelValue);
        pcLabelFactory.setLableUseing("0");
        return pcLabelFactory;
    }
    /**
        获取对应标签的值
     */
    private String getLabelValue(SimpleSRaFactoryTransferRateAnalysis record){
        BigDecimal analyseValue = getAnalyseValue(record);
        return getInterval(analyseValue);
    }

    /**
     * 判断值处于什么区间 获取对应标签值的code
     */
    public static String getInterval(BigDecimal value){
        if (value == null){
            return LabelValueEnum.CODE_1001.getArgumentsCode();
        }
        if (new BigDecimal(50).compareTo(value) >= 0){
            return LabelValueEnum.CODE_1001.getArgumentsCode();
        }
        if (new BigDecimal(50).compareTo(value) < 0 && new BigDecimal(75).compareTo(value) >= 0){
            return LabelValueEnum.CODE_1002.getArgumentsCode();
        }
        if (new BigDecimal(75).compareTo(value) < 0){
            return LabelValueEnum.CODE_1003.getArgumentsCode();
        }
        return LabelValueEnum.CODE_1001.getArgumentsCode();
    }

    /**
     * 获取要对应行业 传输率的 标签code
     */
    protected abstract String getLabelCode();

    /**
     * 获取要分析的值
     */
    protected abstract BigDecimal getAnalyseValue(SimpleSRaFactoryTransferRateAnalysis entity);

    /**
     * 查询所有需要分析的数据均值 根据企业id分过组 多大条数也就是拥有企业的条数了
     * @return
     */
    protected abstract List<SimpleSRaFactoryTransferRateAnalysis> getDataList();



}
