package com.gyee.protocol.gyfp2.message;


import com.gyee.edge.common.utils.ByteUtil;
import com.gyee.edge.common.utils.BytesUtils;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
import lombok.Data;

import java.io.Serializable;


@Data
public class MessageMutable implements Serializable {
    private byte messageType;
    private int key;
    private long ts;



    public byte[] toBytes(int attribute){
        ByteBuf buffer = Unpooled.buffer(4);
        if(attribute==1){
            buffer.writeBytes(BytesUtils.intToByte2(getKey()));
        }else if(attribute==2){
            buffer.writeByte(getMessageType());
        }else if(attribute==3){
            buffer.writeByte(getMessageType());
            buffer.writeBytes(BytesUtils.intToByte2(getKey()));
        }else if(attribute==4){
            buffer.writeLong(getTs());
        }else if(attribute==5){
            buffer.writeBytes(BytesUtils.intToByte2(getKey()));
            buffer.writeLong(getTs());
        }else if (attribute==6){
            buffer.writeByte(getMessageType());
            buffer.writeLong(getTs());
        }else if(attribute==7){
            buffer.writeByte(getMessageType());
            buffer.writeBytes(BytesUtils.intToByte2(getKey()));
            buffer.writeLong(getTs());
        }
        byte[] bytes = ByteBufUtil.getBytes(buffer);
        return bytes;
    }

    //字节数组转MessageMutable对象
    public static MessageMutable toMessageMutable(byte[] bytes, int attribute){
        MessageMutable messageMutable = new MessageMutable();
        if (bytes.length > 16) {
            if (attribute == 1) {
                //获取header头部字节大小
                byte[] bytes1 = new byte[3];
                System.arraycopy(bytes, 16, bytes1, 0, 3);
                int i = BytesUtils.BytesToInt(bytes1, 0);
                messageMutable.setKey(i);
            }else if (attribute == 2) {
                byte[] bytes1 = new byte[1];
                System.arraycopy(bytes, 16, bytes1, 0, 1);
                messageMutable.setMessageType(bytes1[0]);
            }else if (attribute == 3) {
                byte[] bytes1 = new byte[4];
                System.arraycopy(bytes, 16, bytes1, 0, 4);
                messageMutable.setMessageType(bytes1[0]);
                int i = BytesUtils.BytesToInt(bytes1, 1);
                messageMutable.setKey(i);
            }else if (attribute == 4) {
                byte[] bytes1 = new byte[8];
                System.arraycopy(bytes, 16, bytes1, 0, 8);
                messageMutable.setTs(ByteUtil.getLong(bytes1, 0));
            }else if (attribute == 5) {
                byte[] bytes1 = new byte[11];
                System.arraycopy(bytes, 16, bytes1, 0, 11);
                int i = BytesUtils.BytesToInt(bytes1, 0);
                messageMutable.setKey(i);
                messageMutable.setTs(BytesUtils.getLong2(bytes1, 3));
            }else if (attribute == 6) {
                byte[] bytes1 = new byte[9];
                System.arraycopy(bytes, 16, bytes1, 0, 9);
                messageMutable.setMessageType(bytes1[0]);
                messageMutable.setTs(BytesUtils.getLong2(bytes1, 1));
            }else if (attribute == 7){
                byte[] bytes1 = new byte[12];
                System.arraycopy(bytes, 16, bytes1, 0, 12);
                messageMutable.setMessageType(bytes1[0]);
                int i = BytesUtils.BytesToInt(bytes1, 1);
                messageMutable.setKey(i);
                messageMutable.setTs(BytesUtils.getLong2(bytes1, 4));
            }
        }
        return messageMutable;
    }
}
