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

import cn.hutool.json.JSONUtil;
import com.seer.teach.netty.common.annotation.ImMessageType;
import com.seer.teach.netty.common.dto.AckExtend;
import com.seer.teach.netty.common.proto.MessageProtobuf;
import com.seer.teach.netty.im.handler.im.ImMsgHandler;
import com.seer.teach.netty.im.manager.PendingAckManager;
import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

/**
 * @Author: Captain
 * @Description: ACK(1009) 处理器：确认服务端下发消息已被客户端收到
 * @Date: 2025-05-17 18:55
 */
@Service
@Slf4j
@Component
@ImMessageType(1009)
public class AckHandlerImpl implements ImMsgHandler {

    /**
     * 处理ACK消息，确认服务端下发的消息已被客户端成功接收
     *
     * @param ctx Netty通道处理上下文，用于与客户端进行通信
     * @param msg 接收到的ACK消息对象，包含消息头和消息体信息
     */
    @Override
    public void handle(ChannelHandlerContext ctx, MessageProtobuf.Msg msg) {
        String extendJson = msg.getHead().getExtend();
        AckExtend ackExtend = JSONUtil.toBean(extendJson, AckExtend.class);

        // 标记 ACK
        PendingAckManager.complete(ackExtend.getFromMsgId(), true);

        // 输出 ACK 日志
        MessageProtobuf.Head head = msg.getHead();

        log.info("\n====== IM-ACK 收到 ======\n" +
                        "设备           : {}\n" +
                        "原消息ID       : {}\n" +
                        "当前ACK MsgId  : {}\n" +
                        "MsgContentType : {}\n" +
                        "通道ID        : {}\n" +
                        "======================",
                safe(head.getDevice()),
                safe(ackExtend.getFromMsgId()),
                safe(head.getMsgId()),
                head.getMsgContentType(),
                ctx.channel().id().asShortText()
        );

    }

    /**
     * 防御式取值，避免 NPE 影响日志
     *
     * @param s 待检查的字符串
     * @return 如果字符串为null则返回空字符串，否则返回原字符串
     */
    private static String safe(String s) {
        return s == null ? "" : s;
    }
}

