package com.m2pool.chat.coverter;

import com.m2pool.common.core.utils.JsonUtil;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageDeliveryException;
import org.springframework.messaging.MessageHeaders;
import org.springframework.messaging.converter.MessageConverter;
import org.springframework.messaging.support.GenericMessage;

import java.nio.charset.StandardCharsets;

/**
 * @ClassName CommonMessageConvert
 * @Description 消息对象转换器
 * @Author yyb
 * @Date 2025/4/10 16:01
 */
public class CommonMessageConvert implements MessageConverter {
    /**
     * 将客户端发送过来的消息转换为指定的对象
     * @param message 客户端发送过来的消息
     * @param targetClass 目标数据类型  注意：这里的targetClass是消息对象，对应接口的@Payload 注解的类型，且里面序列化的字段必须一模一样。否则序列化报错
     * @return 转换后的对象
     */
    @Override
    public Object fromMessage(Message<?> message, Class<?> targetClass) {
        if (message.getPayload() instanceof byte[]) {
            try {
                String textPayload = new String((byte[]) message.getPayload(), StandardCharsets.UTF_8);
                System.out.println("发送者发送到服务器的消息："+textPayload);
                return JsonUtil.convertString2Object(textPayload,targetClass);
            } catch (Exception e) {
                System.out.println("错误详情"+e);
                throw new MessageDeliveryException( "消息格式错误");
            }
        }
        return null;
    }



    /**
     * 将消息转为Message
     * @param payload 需要转换的消息
     * @param headers 消息头信息
     * @return broker的消息实体
     */
    @Override
    public Message<?> toMessage(Object payload, MessageHeaders headers) {
        String str = JsonUtil.toJson(payload);
        System.out.println("发送给接受者的消息："+payload);
        byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
        return new GenericMessage<>(bytes, headers);
    }

}
