package dhcp

import (
	"bytes"
	"fmt"

	"github.com/google/netstack/tcpip"
)

func (h header) String() string {
	opts, err := h.options()
	var msgtype dhcpMsgType
	if err == nil {
		msgtype, err = opts.dhcpMsgType()
	}
	if !h.isValid() || err != nil {
		return fmt.Sprintf("DHCP invalid, %v %v h[1:4]=%x cookie=%x len=%d (%v)", h.op(), h.xid(), []byte(h[1:4]), []byte(h[236:240]), len(h), err)
	}
	buf := new(bytes.Buffer)
	fmt.Fprintf(buf, "%v %v len=%d\n", msgtype, h.xid(), len(h))
	fmt.Fprintf(buf, "\tciaddr:%v yiaddr:%v siaddr:%v giaddr:%v\n",
		tcpip.Address(h.ciaddr()),
		tcpip.Address(h.yiaddr()),
		tcpip.Address(h.siaddr()),
		tcpip.Address(h.giaddr()))
	fmt.Fprintf(buf, "\tchaddr:%x", h.chaddr())
	for _, opt := range opts {
		fmt.Fprintf(buf, "\n\t%v", opt)
	}
	return buf.String()
}

func (opt option) String() string {
	buf := new(bytes.Buffer)
	fmt.Fprintf(buf, "%v: ", opt.code)
	fmt.Fprintf(buf, "%x", opt.body)
	return buf.String()
}

func (code optionCode) String() string {
	switch code {
	case optSubnetMask:
		return "option(subnet-mask)"
	case optDefaultGateway:
		return "option(default-gateway)"
	case optDomainNameServer:
		return "option(dns)"
	case optDomainName:
		return "option(domain-name)"
	case optReqIPAddr:
		return "option(request-ip-address)"
	case optLeaseTime:
		return "option(lease-time)"
	case optDHCPMsgType:
		return "option(message-type)"
	case optDHCPServer:
		return "option(server)"
	case optParamReq:
		return "option(parameter-request)"
	case optMessage:
		return "option(message)"
	case optClientID:
		return "option(client-id)"
	default:
		return fmt.Sprintf("option(%d)", code)
	}
}

func (o op) String() string {
	switch o {
	case opRequest:
		return "op(request)"
	case opReply:
		return "op(reply)"
	}
	return fmt.Sprintf("op(UNKNOWN:%d)", int(o))
}

func (t dhcpMsgType) String() string {
	switch t {
	case dhcpDISCOVER:
		return "DHCPDISCOVER"
	case dhcpOFFER:
		return "DHCPOFFER"
	case dhcpREQUEST:
		return "DHCPREQUEST"
	case dhcpDECLINE:
		return "DHCPDECLINE"
	case dhcpACK:
		return "DHCPACK"
	case dhcpNAK:
		return "DHCPNAK"
	case dhcpRELEASE:
		return "DHCPRELEASE"
	}
	return fmt.Sprintf("DHCP(%d)", int(t))
}

func (v xid) String() string {
	return fmt.Sprintf("xid:%x", uint32(v))
}
