package net

import (
	"encoding/json"
	"strings"

	"github.com/golang/protobuf/jsonpb"
)

func (n Network) SystemString() string {
	switch n {
	case Network_TCP:
		return "tcp"
	case Network_UDP:
		return "udp"
	case Network_UNIX:
		return "unix"
	default:
		return "unknown"
	}
}

func (nl *NetworkList) UnmarshalJSONPB(unmarshaler *jsonpb.Unmarshaler, bytes []byte) error {
	var networkStrList []string
	if err := json.Unmarshal(bytes, &networkStrList); err == nil {
		nl.Network = ParseNetworkStringList(networkStrList)
		return nil
	}

	var networkStr string
	if err := json.Unmarshal(bytes, &networkStr); err == nil {
		strList := strings.Split(networkStr, ",")
		nl.Network = ParseNetworkStringList(strList)
		return nil
	}

	return newError("unknown format of a string list: " + string(bytes))
}

func (nl *NetworkList) MarshalJSONPB(marshaler *jsonpb.Marshaler) ([]byte, error) {
	networkStrList := make([]string, len(nl.Network))

	for idx, network := range nl.Network {
		networkStrList[idx] = network.String()
	}

	return json.Marshal(networkStrList)
}

// HasNetwork returns true if the network list has a certain network.
func HasNetwork(list []Network, network Network) bool {
	for _, value := range list {
		if value == network {
			return true
		}
	}
	return false
}

func ParseNetwork(net string) Network {
	switch strings.ToLower(net) {
	case "tcp":
		return Network_TCP
	case "udp":
		return Network_UDP
	case "unix":
		return Network_UNIX
	default:
		return Network_Unknown
	}
}

func ParseNetworkStringList(strList []string) []Network {
	list := make([]Network, len(strList))
	for idx, str := range strList {
		list[idx] = ParseNetwork(str)
	}

	return list
}
