package netutil

import (
	"net"
	"strconv"
	"strings"
)

// An addr that is neither restricted to TCP nor UDP, but has an IP and a port.
type PortAddr struct {
	IP   net.IP
	Port uint16
}

// Parses an IP address with a port, for example "209.197.29.196:27017".
// If the given string is not valid, this function returns nil.
func ParsePortAddr(addr string) *PortAddr {
	parts := strings.Split(addr, ":")
	if len(parts) != 2 {
		return nil
	}
	ip := net.ParseIP(parts[0])
	if ip == nil {
		return nil
	}
	port, err := strconv.ParseUint(parts[1], 10, 16)
	if err != nil {
		return nil
	}
	return &PortAddr{ip, uint16(port)}
}

func (p *PortAddr) ToTCPAddr() *net.TCPAddr {
	return &net.TCPAddr{p.IP, int(p.Port), ""}
}

func (p *PortAddr) ToUDPAddr() *net.UDPAddr {
	return &net.UDPAddr{p.IP, int(p.Port), ""}
}

func (p *PortAddr) String() string {
	return p.IP.String() + ":" + strconv.FormatUint(uint64(p.Port), 10)
}