package entity

import (
	"net"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestNormalizeResourcePoolName(t *testing.T) {
	t.Parallel()

	tests := []struct {
		name string
		in   string
		want string
	}{
		{
			name: "trim and fold ASCII",
			in:   "  Production-Pool  ",
			want: "production-pool",
		},
		{
			name: "Unicode case fold",
			in:   "Straße",
			want: "strasse",
		},
		{
			name: "empty",
			in:   "  ",
			want: "",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()
			require.Equal(t, tt.want, NormalizeResourcePoolName(tt.in))
		})
	}
}

func TestCanonicalIPv4Range(t *testing.T) {
	t.Parallel()

	tests := []struct {
		name      string
		cidr      string
		wantStart net.IP
		wantEnd   net.IP
	}{
		{
			name:      "canonicalizes host bits",
			cidr:      " 10.12.3.99/24 ",
			wantStart: net.IPv4(10, 12, 3, 0).To4(),
			wantEnd:   net.IPv4(10, 12, 3, 255).To4(),
		},
		{
			name:      "single address",
			cidr:      "192.0.2.9/32",
			wantStart: net.IPv4(192, 0, 2, 9).To4(),
			wantEnd:   net.IPv4(192, 0, 2, 9).To4(),
		},
		{
			name:      "entire IPv4 range",
			cidr:      "0.0.0.0/0",
			wantStart: net.IPv4(0, 0, 0, 0).To4(),
			wantEnd:   net.IPv4(255, 255, 255, 255).To4(),
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			t.Parallel()
			start, end, err := CanonicalIPv4Range(tt.cidr)
			require.NoError(t, err)
			require.Equal(t, []byte(tt.wantStart), start)
			require.Equal(t, []byte(tt.wantEnd), end)
		})
	}
}

func TestCanonicalIPv4RangeRejectsInvalidInput(t *testing.T) {
	t.Parallel()

	for _, cidr := range []string{"not-a-cidr", "2001:db8::/64"} {
		t.Run(cidr, func(t *testing.T) {
			t.Parallel()
			start, end, err := CanonicalIPv4Range(cidr)
			require.Error(t, err)
			require.Nil(t, start)
			require.Nil(t, end)
		})
	}
}
