//go:build freebsd
// +build freebsd

package functions

import (
	"errors"
	"strconv"
	"strings"

	"github.com/gravitl/netmaker/logger"
	"github.com/gravitl/netmaker/netclient/config"
	"github.com/gravitl/netmaker/netclient/ncutils"
)

// GetLocalListenPort - Gets the port running on the local interface
func GetLocalListenPort(ifacename string) (int32, error) {
	portstring, err := ncutils.RunCmd("wg show "+ifacename+" listen-port", false)
	if err != nil {
		return 0, err
	}
	portstring = strings.TrimSuffix(portstring, "\n")
	i, err := strconv.ParseInt(portstring, 10, 32)
	if err != nil {
		return 0, err
	} else if i == 0 {
		return 0, errors.New("parsed port is unset or invalid")
	}
	return int32(i), nil
}

// UpdateLocalListenPort - check local port, if different, mod config and publish
func UpdateLocalListenPort(nodeCfg *config.ClientConfig) error {
	var err error
	localPort, err := GetLocalListenPort(nodeCfg.Node.Interface)
	if err != nil {
		logger.Log(1, "error encountered checking local listen port: ", err.Error())
	} else if nodeCfg.Node.LocalListenPort != localPort && localPort != 0 {
		logger.Log(1, "local port has changed from ", strconv.Itoa(int(nodeCfg.Node.LocalListenPort)), " to ", strconv.Itoa(int(localPort)))
		nodeCfg.Node.LocalListenPort = localPort
		err = config.ModConfig(&nodeCfg.Node)
		if err != nil {
			return err
		}
		if err := PublishNodeUpdate(nodeCfg); err != nil {
			logger.Log(0, "could not publish local port change")
		}
	}
	return err
}
