package subnet

import (
	"encoding/json"

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/service/ec2"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/infra-provider/pkg/procedure"
)

// DEPRECATED(liubo02): DON'T describe subnets directly, use crossplane to fetch subnet data
func DescribeSubnets(awssvc procedure.AWSService, network *cloudv1.Network) ([]*ec2.Subnet, error) {
	var provider struct {
		AssumeRoleArn    string
		AssumeExternalId string
		SubnetIds        []string
	}
	if err := json.Unmarshal(network.Spec.ForProvider.Raw, &provider); err != nil {
		return nil, err
	}

	subNetsOutput, err := awssvc.EC2API(&procedure.AssumedRole{
		RoleARN:    provider.AssumeRoleArn,
		ExternalID: provider.AssumeExternalId,
	}).DescribeSubnets(&ec2.DescribeSubnetsInput{
		SubnetIds: aws.StringSlice(provider.SubnetIds),
	})
	if err != nil {
		return nil, err
	}
	return subNetsOutput.Subnets, nil
}

// DEPRECATED(liubo02): DON'T use ec2.Subnet directly
func FindSubnetIdsByZones(subnets []*ec2.Subnet, zones []string) []string {
	var exceptSubnetIds []string
	for _, subnet := range subnets {
		for _, zone := range zones {
			if *subnet.AvailabilityZone == zone {
				exceptSubnetIds = append(exceptSubnetIds, *subnet.SubnetId)
			}
		}
	}
	return exceptSubnetIds
}
