package linker

import (
	"github.com/wpajqz/linker/utils/convert"
)

type (
	Packet struct {
		Operator     uint32
		Sequence     int64
		HeaderLength uint32
		BodyLength   uint32
		Header       []byte
		Body         []byte
	}

	// Packet plugin, for example debug,gzip,encrypt,decrypt
	PacketPlugin interface {
		Handle(header, body []byte) (h, b []byte)
	}
)

func NewPacket(operator uint32, sequence int64, header, body []byte, plugins []PacketPlugin) (Packet, error) {
	for _, plugin := range plugins {
		header, body = plugin.Handle(header, body)
	}

	return Packet{
		Operator:     operator,
		Sequence:     sequence,
		HeaderLength: uint32(len(header)),
		BodyLength:   uint32(len(body)),
		Header:       header,
		Body:         body,
	}, nil
}

// 得到序列化后的Packet
func (p Packet) Bytes() (buf []byte) {
	buf = append(buf, convert.Uint32ToBytes(p.Operator)...)
	buf = append(buf, convert.Int64ToBytes(p.Sequence)...)
	buf = append(buf, convert.Uint32ToBytes(p.HeaderLength)...)
	buf = append(buf, convert.Uint32ToBytes(p.BodyLength)...)
	buf = append(buf, p.Header...)
	buf = append(buf, p.Body...)

	return buf
}
