package net

type Packet interface {
	Destination() Destination
	Chunk() []byte // First chunk of this commnunication
	MoreChunks() bool
}

func NewTCPPacket(dest Destination) *TCPPacket {
	return &TCPPacket{
		basePacket: basePacket{destination: dest},
	}
}

func NewUDPPacket(dest Destination, data []byte) *UDPPacket {
	return &UDPPacket{
		basePacket: basePacket{destination: dest},
		data:       data,
	}
}

type basePacket struct {
	destination Destination
}

func (base basePacket) Destination() Destination {
	return base.destination
}

type TCPPacket struct {
	basePacket
}

func (packet *TCPPacket) Chunk() []byte {
	return nil
}

func (packet *TCPPacket) MoreChunks() bool {
	return true
}

type UDPPacket struct {
	basePacket
	data []byte
}

func (packet *UDPPacket) Chunk() []byte {
	return packet.data
}

func (packet *UDPPacket) MoreChunks() bool {
	return false
}