package com.imadcn.framework.idworker.spring.schema.parser;

import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.w3c.dom.Element;

import com.imadcn.framework.idworker.common.ConfigConstants;
import com.imadcn.framework.idworker.generator.CompressUUIDGenerator;
import com.imadcn.framework.idworker.generator.SnowflakeGenerator;

/**
 * generator:xxx 标签解析
 * 
 * @author imadcn
 * @since 1.2.0
 */
public class GeneratorBeanDefinitionParser extends BaseBeanDefinitionParser {

    private String generatorType;

    /**
     * generator:xxx 标签解析
     * 
     * @param generatorType 解析类型
     */
    public GeneratorBeanDefinitionParser(String generatorType) {
        this.generatorType = generatorType;
    }

    @Override
    protected AbstractBeanDefinition parseInternal(final Element element, final ParserContext parserContext) {
        Class<?> generatorClass = null;
        if (ConfigConstants.SNOWFLAKE.equals(generatorType)) {
            generatorClass = SnowflakeGenerator.class;
        } else if (ConfigConstants.COMPRESS_UUID.equals(generatorType)) {
            generatorClass = CompressUUIDGenerator.class;
        } else {
            throw new IllegalArgumentException("unknown registryType");
        }
        BeanDefinitionBuilder result = BeanDefinitionBuilder.rootBeanDefinition(generatorClass);
        // snowflake 生成策略
        if (generatorClass.isAssignableFrom(SnowflakeGenerator.class)) {
            result.addConstructorArgValue(
                    GeneratorRegisteryBuilder.buildWorkerNodeRegisterBeanDefinition(element, parserContext));
            // 去掉低并发模式配置解析
            // result.addPropertyValue(PropertyConstants.LOW_CONCURRENCY,
            // getAttributeValue(element,
            // GeneratorBeanDefinitionTag.LOW_CONCURRENCY));
            result.setInitMethodName("init");
        }
        return result.getBeanDefinition();
    }

}