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;
import java.util.stream.Collectors;

/**
 * 字符串信息点 处理器
 * @author Charlie Yu
 * @date 2021-07-12
 */
public class StringInfoParser extends AbstractInfoDataParser{

    @Override
    protected void validateDefine(ParserResult result) throws IOException {
        // 字符串类型不支持区间格式
        if(result.isRegion()) {
            throw new BusinessException(StrUtil.format("信息点[{}]定义有误，STRING类型不允许定义区间！", result.getInfoDefine().getCode()));
        }
        // 数据源 - 应为区间列表格式
        formatRegionListValue(result.getInfoDefine().getDataSource(), Integer.class);
    }

    @Override
    protected void validateValue(ParserResult result) throws IOException {
        // 数据源定义信息
        List<RegionValue<Integer>> dataSource = formatRegionListValue(result.getInfoDefine().getDataSource(), Integer.class);
        // 复数
        if(result.isMulti()) {
            List<String> valueList = formatListValue(result.getValueInfo(), String.class);
            // 字符串长度校验
            List<Integer> lengthList = valueList.stream().map(String::length).collect(Collectors.toList());
            if(!RegionUtil.allContain(dataSource, lengthList)) {
                throw new BusinessException(StrUtil.format("信息点[{}]数据有误，超出区间范围！", result.getInfoDefine().getCode()));
            }
        } else {
            // 单数
            String value = formatValue(result.getValueInfo(), String.class);
            // 字符串长度校验
            if(!RegionUtil.anyContain(dataSource, value.length())) {
                throw new BusinessException(StrUtil.format("信息点[{}]数据有误，超出区间范围！", result.getInfoDefine().getCode()));
            }
        }
    }
}
