package com.seer.teach.teacher.service.registry.questionsCorrect;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

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


/**
 * 题目处理器注册中心
 * <p>
 * 用于将实现了 {@link QuestionsCorrectHandler} 接口的所有处理器自动注册到内存中，
 * 并通过题目类型提供对应处理器的获取方法。
 * </p>
 * <p>
 * 该注册中心在Spring容器启动时自动扫描并注册所有{@link QuestionsCorrectHandler}实现类，
 * 并提供根据题目类型获取对应处理器的功能，主要用于MQ消费者根据题目类型调用对应处理器进行消息处理。
 * </p>
 *
 * @author Captain
 * @version 1.0
 * @since 2025-07-16 19:56
 */
@Slf4j
@Component
public class QuestionsCorrectHandlerRegistry {

    private final Map<Integer, QuestionsCorrectHandler> handlerMap = new HashMap<>();

    /**
     * 构造函数，用于初始化题目处理器注册中心
     * 通过Spring自动注入所有QuestionsCorrectHandler实现类的实例列表，
     * 并将它们按照类型注册到内部的处理器映射表中
     *
     * @param handlers QuestionsCorrectHandler处理器实例列表，由Spring容器自动装配
     */
    @Autowired
    public QuestionsCorrectHandlerRegistry(List<QuestionsCorrectHandler> handlers) {
        for (QuestionsCorrectHandler handler : handlers) {
            Integer type = handler.getType();
            if (handlerMap.containsKey(type)) {
                log.warn("重复注册处理器 tag={}", type);
            }
            handlerMap.put(type, handler);
            log.info("注册题目批改器 type={}，handler={}", type, handler.getClass().getSimpleName());
        }
    }

    /**
     * 根据题目类型获取对应的处理器实例
     *
     * @param type 题目类型标识
     * @return 对应类型的QuestionsCorrectHandler处理器实例，如果未找到则返回null
     */
    public QuestionsCorrectHandler getHandler(Integer type) {
        return handlerMap.get(type);
    }
}
