package com.seer.teach.netty.im.handler.mq;

import com.seer.teach.common.dto.mq.MqDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 大模块 MQ 指令处理器接口
 * <p>
 * 用于处理来自 MQ 中 "MqCommond" 主题的特定 tag 类型消息。
 * 每个实现类负责一种 tag 对应的业务处理逻辑。
 * </p>
 * 实现类需定义所处理的消息类型 {@link #getType()}，处理逻辑 {@link #handle(MqDTO)}，
 * 以及唯一标识当前处理器的 tag {@link #getTag()}。
 *
 * @param <T> 消息体的数据结构类型，必须继承 {@link MqDTO}
 * @author Captain
 * @version 1.0
 * @since 2025-07-16 19:55
 */
public interface ImLargeModuleHandler<T extends MqDTO> {

    /**
     * 处理指定类型的消息体。
     *
     * @param messageBody 消息体内容，已反序列化为具体类型 T
     */
    void handle(T messageBody, String device);

    /**
     * 获取当前处理器支持的泛型类型。
     * 用于在消费端对消息进行动态反序列化。
     *
     * @return 当前处理器绑定的数据类型 Class 对象
     */
    Class<T> getType();

    /**
     * 返回当前处理器所绑定的消息 tag。
     * 用于 MQ 消费者根据 tag 进行路由匹配。
     *
     * @return 当前处理器对应的消息 tag 字符串
     */
    String getTag();

    /**
     * 包装方法：带日志的 handle
     */
    default void handleWithLog(T messageBody, String device) {
        Logger log = LoggerFactory.getLogger(getClass());
        log.info("\n====== MQ 收到指令 ======\n" +
                        "设备       : {}\n" +
                        "Tag        : {}\n" +
                        "======================",
                device, getTag());
        handle(messageBody, device);
    }
}
