package resourcepool

import (
	"strings"
	"testing"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
)

func TestValidateResourcePoolZoneConfig(t *testing.T) {
	tests := []struct {
		name           string
		resourcePool   *globalngv1.ResourcePool
		wantErrMessage string
	}{
		{
			name: "omitted zone config uses dataplane manager default",
			resourcePool: &globalngv1.ResourcePool{
				HighAvailabilityType: globalngv1.ResourcePool_ZONAL,
			},
		},
		{
			name: "zonal requires one node zone",
			resourcePool: &globalngv1.ResourcePool{
				HighAvailabilityType: globalngv1.ResourcePool_ZONAL,
				ZoneConfig: &globalngv1.ResourcePool_ZoneConfig{
					NodeZones: []string{"us-west-2a"},
				},
			},
		},
		{
			name: "regional requires three node zones",
			resourcePool: &globalngv1.ResourcePool{
				HighAvailabilityType: globalngv1.ResourcePool_REGIONAL,
				ZoneConfig: &globalngv1.ResourcePool_ZoneConfig{
					NodeZones: []string{"us-west-2a", "us-west-2b", "us-west-2c"},
				},
			},
		},
		{
			name: "zonal rejects three node zones",
			resourcePool: &globalngv1.ResourcePool{
				HighAvailabilityType: globalngv1.ResourcePool_ZONAL,
				ZoneConfig: &globalngv1.ResourcePool_ZoneConfig{
					NodeZones: []string{"us-west-2a", "us-west-2b", "us-west-2c"},
				},
			},
			wantErrMessage: "exactly 1 zone",
		},
		{
			name: "regional rejects one node zone",
			resourcePool: &globalngv1.ResourcePool{
				HighAvailabilityType: globalngv1.ResourcePool_REGIONAL,
				ZoneConfig: &globalngv1.ResourcePool_ZoneConfig{
					NodeZones: []string{"us-west-2a"},
				},
			},
			wantErrMessage: "exactly 3 zones",
		},
		{
			name: "node zones require high availability type",
			resourcePool: &globalngv1.ResourcePool{
				ZoneConfig: &globalngv1.ResourcePool_ZoneConfig{
					NodeZones: []string{"us-west-2a"},
				},
			},
			wantErrMessage: "high_availability_type must be set",
		},
		{
			name: "duplicate node zone rejected",
			resourcePool: &globalngv1.ResourcePool{
				HighAvailabilityType: globalngv1.ResourcePool_REGIONAL,
				ZoneConfig: &globalngv1.ResourcePool_ZoneConfig{
					NodeZones: []string{"us-west-2a", "us-west-2a", "us-west-2c"},
				},
			},
			wantErrMessage: "duplicate zone",
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			err := validateResourcePoolZoneConfig(tt.resourcePool)
			if tt.wantErrMessage == "" {
				if err != nil {
					t.Fatalf("expected no error, got %v", err)
				}
				return
			}
			if err == nil {
				t.Fatalf("expected error")
			}
			if !strings.Contains(err.Error(), tt.wantErrMessage) {
				t.Fatalf("expected error %q to contain %q", err.Error(), tt.wantErrMessage)
			}
		})
	}
}
