package packer

import "net"
import "fmt"

type addressFamily int

// packerHeader structure to hold our header information.
type packerHeader struct {
	family    addressFamily
	address   net.IP
	Port      int
	Service   string
	HeaderLen byte
}

//Family -- ENUM for Address Family
const (
	FamilyIPv4 addressFamily = iota
	FamilyIPv6
)

var addressFamilyText = [...]string{
	"IPv4",
	"IPv6",
}

func newPackerHeader() (p *packerHeader) {
	p = new(packerHeader)
	p.SetAddress("127.0.0.1")
	p.Port = 65535
	p.Service = "na"
	p.HeaderLen = 0
	return
}

//SetAddress -- Set Address. which sets address family automatically
func (p *packerHeader) SetAddress(addr string) {
	p.address = net.ParseIP(addr)
	err := p.address.To4()

	if err != nil {
		p.family = FamilyIPv4
	} else {
		err := p.address.To16()
		if err != nil {
			p.family = FamilyIPv6
		} else {
			panic(fmt.Sprintf("setAddress does not support %s", addr))
		}
	}
}

func (p *packerHeader) AddressBytes() (b []byte) {
	b = make([]byte, 16)

	switch {
	case p.address.To4() != nil:
		b = make([]byte, 4)
		for pos := range b {
			b[pos] = p.address[pos+12]
		}
		return
	}
	return
}

func (p *packerHeader) Address() (address net.IP) {
	address = p.address
	return
}

func (p *packerHeader) Family() (family addressFamily) {
	family = p.family
	return
}

func (p *packerHeader) FamilyText() (familyText string) {
	familyText = addressFamilyText[p.family]
	return
}