package com.seamew.lottery.domain.support.ids;

import com.seamew.lottery.common.Constants;
import com.seamew.lottery.domain.support.ids.annotation.IdMode;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.AnnotationUtils;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: seamew
 * @Title: IdContext
 * @CreateTime: 2023年02月16日 10:56:00
 * @Description: Id 策略模式上下文配置「在正式的完整的系统架构中，ID 的生成会有单独的服务来完成，其他服务来调用 ID 生成接口即可」
 * @Version: 1.0
 */
@Configuration
public class IdContext {

    @Resource
    private List<IIdGenerator> idGeneratorList  = new ArrayList<>();

    /**
     * 创建 ID 生成策略对象，属于策略设计模式的使用方式
     *
     * @return IIdGenerator 实现类
     */
    @Bean
    public Map<Constants.Ids, IIdGenerator> idGenerator() {
        Map<Constants.Ids, IIdGenerator> idGeneratorMap = new HashMap<>(8);
        idGeneratorList.forEach(element -> {
            IdMode idMode = AnnotationUtils.findAnnotation(element.getClass(), IdMode.class);
            if (idMode != null) {
                idGeneratorMap.put(idMode.idMode(), element);
            }
        });
        return idGeneratorMap;
    }
}
