package com.seer.teach.netty.im.config.rocketmq;

import cn.hutool.json.JSONUtil;
import com.seer.teach.common.dto.mq.MqDTO;
import com.seer.teach.common.enums.im.ImMqTopicEnum;
import com.seer.teach.netty.im.handler.mq.ImRedisChannelPushHandler;
import com.seer.teach.netty.im.registry.ImSsePushDataHandlerRegistry;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.common.message.MessageExt;
import org.springframework.stereotype.Component;

@Slf4j
@Component
@RequiredArgsConstructor
public class ImRedisChannelPushConsumer extends AbstractRocketMQConsumer {

    private final ImSsePushDataHandlerRegistry handlerRegistry;

    @Override
    protected ImMqTopicEnum getTopic() {
        return ImMqTopicEnum.REDIS_CHANNEL_PUSH;
    }

    @Override
    protected void doHandleMessage(String tag, String device, String body, MessageExt message) {
        ImRedisChannelPushHandler<?> handler = handlerRegistry.getHandler(tag);
        if (handler == null) {
            log.warn("未找到对应处理器：tag={}", tag);
            return;
        }
        Object parsedObj = parseMessageBody(body, handler);
        if (parsedObj == null) return;
        invokeHandler(handler, parsedObj, device);
    }

    private Object parseMessageBody(String body, ImRedisChannelPushHandler<?> handler) {
        try {
            return JSONUtil.toBean(body, handler.getType());
        } catch (Exception e) {
            log.error("JSON 解析失败：type={}, body={}", handler.getType().getSimpleName(), body, e);
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    private <T extends MqDTO> void invokeHandler(ImRedisChannelPushHandler<?> handler, Object message, String device) {
        ((ImRedisChannelPushHandler<T>) handler).handleWithLog((T) message, device);
    }
}
