package com.persagy.dmp.rwd.parser.service.impl;

import cn.hutool.core.util.StrUtil;
import com.persagy.dmp.common.exception.BusinessException;
import com.persagy.dmp.common.model.data.RegionValue;
import com.persagy.dmp.common.utils.RegionUtil;
import com.persagy.dmp.rwd.parser.entity.ParserResult;

import java.io.IOException;
import java.util.List;

/**
 * 数值信息点 处理器
 * @author Charlie Yu
 * @date 2021-07-12
 */
public class NumberInfoParser <T extends Comparable> extends AbstractInfoDataParser {

    @Override
    protected void validateDefine(ParserResult result) throws IOException {
        // 数据源 - 应为区间列表格式
        formatRegionListValue(result.getInfoDefine().getDataSource(), getClassType());
    }

    @Override
    protected void validateValue(ParserResult result) throws IOException {
        // 数据源定义信息
        List<RegionValue<T>> dataSource = formatRegionListValue(result.getInfoDefine().getDataSource(), getClassType());
        // 复数
        if(result.isMulti()) {
            // 复数区间
            if(result.isRegion()) {
                List<RegionValue<T>> valueList = formatRegionListValue(result.getValueInfo(), getClassType());
                // 区间范围校验
                if (!RegionUtil.allContains(dataSource, valueList)) {
                    throw new BusinessException(StrUtil.format("信息点[{}]数据有误，超出区间范围！", result.getInfoDefine().getCode()));
                }
            } else {
                // 复数非区间
                List<T> valueList = formatListValue(result.getValueInfo(), getClassType());
                // 区间范围校验
                if (!RegionUtil.allContain(dataSource, valueList)) {
                    throw new BusinessException(StrUtil.format("信息点[{}]数据有误，超出区间范围！", result.getInfoDefine().getCode()));
                }
            }
        } else {
            // 单数区间
            if(result.isRegion()) {
                RegionValue<T> value = formatRegionValue(result.getValueInfo(), getClassType());
                // 区间范围校验
                if (!RegionUtil.anyContains(dataSource, value)) {
                    throw new BusinessException(StrUtil.format("信息点[{}]数据有误，超出区间范围！", result.getInfoDefine().getCode()));
                }
            } else {
                // 单数非区间
                T value = formatValue(result.getValueInfo(), getClassType());
                // 区间范围校验
                if (!RegionUtil.anyContain(dataSource, value)) {
                    throw new BusinessException(StrUtil.format("信息点[{}]数据有误，超出区间范围！", result.getInfoDefine().getCode()));
                }
            }
        }
    }

    /**
     * 泛型类
     * @return
     */
    protected Class<T> getClassType() {
        return null;
    }
}
