package task

import (
	"testing"

	"github.com/stretchr/testify/assert"

	"github.com/tidbcloud/infra-provider/regional-server/api/v1alpha1"
)

func TestContext_GetPrivateSubnetZoneIDs(t *testing.T) {
	c := &Context{
		VPC: &v1alpha1.VPC{
			Status: v1alpha1.VPCStatus{
				PrivateSubnets: []v1alpha1.Subnet{
					{AvailabilityZoneID: "ap-southeast-1b"},
					{AvailabilityZoneID: "ap-southeast-1a"},
					{AvailabilityZoneID: "ap-southeast-1b"},
				},
			},
		},
	}

	assert.Equal(t, []string{"ap-southeast-1b", "ap-southeast-1a", "ap-southeast-1b"}, c.GetPrivateSubnetZoneIDs())
}

func TestContext_GetEndpointServicePort_AndPorts(t *testing.T) {
	cases := []struct {
		name      string
		lb        v1alpha1.LoadBalancerInfo
		wantPort  int32
		wantPorts []int32
	}{
		{
			name:      "legacy populated port surfaces directly",
			lb:        v1alpha1.LoadBalancerInfo{Port: 4000},
			wantPort:  4000,
			wantPorts: nil,
		},
		{
			name:      "multi-port surfaces first listener as primary plus list",
			lb:        v1alpha1.LoadBalancerInfo{Port: 9042, Ports: []int32{9042, 9142}},
			wantPort:  9042,
			wantPorts: []int32{9042, 9142},
		},
		{
			name:      "uninitialized status falls back to default for primary, nil for list",
			lb:        v1alpha1.LoadBalancerInfo{},
			wantPort:  v1alpha1.DefaultPrivateSQLEndpointPort,
			wantPorts: nil,
		},
	}

	for _, tc := range cases {
		t.Run(tc.name, func(t *testing.T) {
			c := &Context{PrivateLinkService: &v1alpha1.PrivateLinkService{Status: v1alpha1.PrivateLinkServiceStatus{LoadBalancer: tc.lb}}}
			assert.Equal(t, tc.wantPort, c.GetEndpointServicePort())
			assert.Equal(t, tc.wantPorts, c.GetEndpointServicePorts())
		})
	}
}
