package ganserv_test

import (
	"fmt"
	"net"
	"strconv"
	"testing"

	"imuslab.com/zoraxy/mod/ganserv"
)

func TestGetRandomFreeIP(t *testing.T) {
	n := ganserv.Network{
		CIDR: "172.16.0.0/12",
		Nodes: []*ganserv.Node{
			{
				Name:      "nodeC1",
				ManagedIP: net.ParseIP("172.16.1.142"),
			},
			{
				Name:      "nodeC2",
				ManagedIP: net.ParseIP("172.16.5.174"),
			},
		},
	}

	// Call the function for 10 times
	for i := 0; i < 10; i++ {
		freeIP, err := n.GetRandomFreeIP()
		fmt.Println("["+strconv.Itoa(i)+"] Free IP address assigned: ", freeIP)

		// Assert that no error occurred
		if err != nil {
			t.Errorf("Unexpected error: %s", err.Error())
		}

		// Assert that the returned IP is a valid IPv4 address
		if freeIP.To4() == nil {
			t.Errorf("Invalid IP address format: %s", freeIP.String())
		}

		// Assert that the returned IP is not already used by a node
		for _, node := range n.Nodes {
			if freeIP.Equal(node.ManagedIP) {
				t.Errorf("Returned IP is already in use: %s", freeIP.String())
			}
		}

		n.Nodes = append(n.Nodes, &ganserv.Node{
			Name:      "NodeT" + strconv.Itoa(i),
			ManagedIP: freeIP,
		})
	}

}