package com.seer.teach.netty.im.registry;

import com.seer.teach.netty.im.handler.mq.ImLargeModuleHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

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

import lombok.extern.slf4j.Slf4j;

/**
 * 大模块 MQ 指令处理器注册中心。
 * <p>
 * 用于收集所有实现了 {@link ImLargeModuleHandler} 接口的处理器，
 * 并根据其 tag 注册到内存中，供 MQ 消费端动态路由调用。
 * </p>
 *
 * <p>每个 tag 对应一个唯一的处理器实例。</p>
 *
 * @author Captain
 * @version 1.0
 * @since 2025-07-16 19:56
 */
@Slf4j
@Component
public class ImLargeModuleRegistry {

    /**
     * 存储 tag 与对应 {@link ImLargeModuleHandler} 实例之间的映射关系。
     * key 为 tag，value 为对应的处理器。
     */
    private final Map<String, ImLargeModuleHandler<?>> handlerMap = new HashMap<>();

    /**
     * 构造方法：自动注入所有实现 {@link ImLargeModuleHandler} 接口的处理器。
     * <p>
     * 会将处理器的 tag 作为 key 注册进 handlerMap，
     * 若存在重复 tag 则记录日志警告。
     * </p>
     *
     * @param handlers 所有注入的 ImLargeModuleHandler 实现类实例列表
     */
    @Autowired
    public ImLargeModuleRegistry(List<ImLargeModuleHandler<?>> handlers) {
        for (ImLargeModuleHandler<?> handler : handlers) {
            String tag = handler.getTag();
            if (handlerMap.containsKey(tag)) {
                log.warn("重复注册处理器 tag={}", tag);
            }
            handlerMap.put(tag, handler);
            log.info("注册消息处理器 tag={}，handler={}", tag, handler.getClass().getSimpleName());
        }
    }

    /**
     * 根据消息 tag 获取对应的处理器实例。
     *
     * @param tag 消息的 tag，用于标识具体处理器类型
     * @return 匹配的 {@link ImLargeModuleHandler} 实例；若不存在则返回 null
     */
    public ImLargeModuleHandler<?> getHandler(String tag) {
        return handlerMap.get(tag);
    }
}
