package ganserv

import (
	"fmt"
	"math/rand"
	"net"
	"time"
)

//Get a random free IP from the pool
func (n *Network) GetRandomFreeIP() (net.IP, error) {
	// Get all IP addresses in the subnet
	ips, err := GetAllAddressFromCIDR(n.CIDR)
	if err != nil {
		return nil, err
	}

	// Filter out used IPs
	usedIPs := make(map[string]bool)
	for _, node := range n.Nodes {
		usedIPs[node.ManagedIP.String()] = true
	}
	availableIPs := []string{}
	for _, ip := range ips {
		if !usedIPs[ip] {
			availableIPs = append(availableIPs, ip)
		}
	}

	// Randomly choose an available IP
	if len(availableIPs) == 0 {
		return nil, fmt.Errorf("no available IP")
	}
	rand.Seed(time.Now().UnixNano())
	randIndex := rand.Intn(len(availableIPs))
	pickedFreeIP := availableIPs[randIndex]

	return net.ParseIP(pickedFreeIP), nil
}