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

import com.seer.teach.netty.im.handler.mq.ImTvInfoHandler;
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;

/**
 * {@code ImTvInfoHandlerRegistry} 是一个处理器注册表，
 * 用于统一管理所有实现了 {@link ImTvInfoHandler} 接口的处理器实例，
 * 并通过消息的 tag 快速获取对应的处理器进行调用。
 *
 * <p>该注册表在 Spring 容器初始化时，自动注入所有 {@code ImTvInfoHandler} 实现类，
 * 并根据它们的 tag 进行映射缓存，以便于消息分发时的高效查找。</p>
 *
 * @author Captain
 * @version 1.0
 * @since 2025-07-16 19:56
 */
@Slf4j
@Component
public class ImTvInfoHandlerRegistry {

    /**
     * 保存 tag 与对应 {@link ImTvInfoHandler} 实例之间的映射关系。
     */
    private final Map<String, ImTvInfoHandler<?>> handlerMap = new HashMap<>();

    /**
     * 构造函数，注入所有实现了 {@link ImTvInfoHandler} 接口的 Bean，
     * 并根据各自的 tag 进行注册映射。
     *
     * @param handlers 所有 {@code ImTvInfoHandler} 实现类列表，由 Spring 自动注入
     */
    @Autowired
    public ImTvInfoHandlerRegistry(List<ImTvInfoHandler<?>> handlers) {
        for (ImTvInfoHandler<?> 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 消息标签，用于区分不同处理器
     * @return 对应的 {@link ImTvInfoHandler} 实例；若不存在则返回 {@code null}
     */
    public ImTvInfoHandler<?> getHandler(String tag) {
        return handlerMap.get(tag);
    }
}
