package subnet

import (
	"testing"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/service/ec2"
	"github.com/stretchr/testify/assert"
)

func TestFindSubnetIdsByZones(t *testing.T) {
	tests := map[string]struct {
		subnets  []*ec2.Subnet
		zones    []string
		expected []string
	}{
		"single subnet matching single zone": {
			subnets: []*ec2.Subnet{
				{
					SubnetId:         aws.String("subnet-1"),
					AvailabilityZone: aws.String("us-west-2a"),
				},
			},
			zones:    []string{"us-west-2a"},
			expected: []string{"subnet-1"},
		},
		"multiple subnets matching multiple zones": {
			subnets: []*ec2.Subnet{
				{
					SubnetId:         aws.String("subnet-1"),
					AvailabilityZone: aws.String("us-west-2a"),
				},
				{
					SubnetId:         aws.String("subnet-2"),
					AvailabilityZone: aws.String("us-west-2b"),
				},
				{
					SubnetId:         aws.String("subnet-3"),
					AvailabilityZone: aws.String("us-west-2c"),
				},
			},
			zones:    []string{"us-west-2b", "us-west-2c"},
			expected: []string{"subnet-2", "subnet-3"},
		},
		"no matching zones": {
			subnets: []*ec2.Subnet{
				{
					SubnetId:         aws.String("subnet-1"),
					AvailabilityZone: aws.String("us-west-2a"),
				},
				{
					SubnetId:         aws.String("subnet-2"),
					AvailabilityZone: aws.String("us-west-2b"),
				},
			},
			zones:    []string{"us-east-1a"},
			expected: []string(nil),
		},
		"empty subnets": {
			subnets:  []*ec2.Subnet{},
			zones:    []string{"us-west-2a"},
			expected: []string(nil),
		},
		"empty zones": {
			subnets: []*ec2.Subnet{
				{
					SubnetId:         aws.String("subnet-1"),
					AvailabilityZone: aws.String("us-west-2a"),
				},
			},
			zones:    []string{},
			expected: []string(nil),
		},
	}

	for name, tt := range tests {
		t.Run(name, func(t *testing.T) {
			result := FindSubnetIdsByZones(tt.subnets, tt.zones)
			assert.Equal(t, tt.expected, result)
		})
	}
}
