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

import cn.hutool.core.map.MapUtil;
import com.fasterxml.jackson.databind.JsonNode;
import com.persagy.dmp.rwd.basic.constant.DigitalDataType;
import com.persagy.dmp.rwd.parser.entity.ParserResult;
import com.persagy.dmp.rwd.parser.service.impl.*;
import com.persagy.dmp.common.exception.BusinessException;
import com.persagy.dmp.define.entity.ObjectInfoDefine;

import java.util.HashMap;
import java.util.Map;

/**
 * 信息点 处理工厂
 * @author Charlie Yu
 * @date 2021-07-12
 */
public class InfoDataFactory {

    /** 信息点处理器Map<DataType, Parser> */
    private static Map<String, IInfoDataParser> parserMap = new HashMap<>(16);

    /**
     * 处理信息点
     * @param infoDefine 信息点 定义信息
     * @param valueInfo 信息点 值信息
     * @return ParserResult
     */
    public static ParserResult parse(ObjectInfoDefine infoDefine, JsonNode valueInfo) {
        IInfoDataParser parser = getParser(infoDefine.getDataType());
        return parser.parse(infoDefine, valueInfo);
    }

    /**
     * 根据数据类型获取信息点处理器
     * @param dataType 数据类型
     * @return
     */
    private static IInfoDataParser getParser(String dataType) {
        // 懒加载
        if(MapUtil.isEmpty(parserMap)) {
            parserMap.put(DigitalDataType.ATTACHMENT.getIndex(), new AttachmentInfoParser());
            parserMap.put(DigitalDataType.BOOLEAN.getIndex(), new BooleanInfoParser());
            parserMap.put(DigitalDataType.DATETIME.getIndex(), new DateInfoParser());
            parserMap.put(DigitalDataType.DOUBLE.getIndex(), new DoubleInfoParser());
            parserMap.put(DigitalDataType.ENUM.getIndex(), new EnumInfoParser());
            parserMap.put(DigitalDataType.INTEGER.getIndex(), new IntegerInfoParser());
            parserMap.put(DigitalDataType.STRING.getIndex(), new StringInfoParser());
            parserMap.put(DigitalDataType.PIC.getIndex(), new PicInfoParser());
            parserMap.put(DigitalDataType.MENUM.getIndex(), new MenumInfoParser());
        }
        // 校验类型传值
        if(!parserMap.containsKey(dataType)) {
            throw new BusinessException("找不到对应数据类型的处理器！");
        }
        return parserMap.get(dataType);
    }
}
