package cloud

import (
	"testing"

	"github.com/stretchr/testify/require"
	regionalpb "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"
	netv1beta1 "github.com/upbound/provider-azure/apis/network/v1beta1"
	"k8s.io/apimachinery/pkg/types"
)

func TestAzureBuildDNS(t *testing.T) {
	provider := &azure{
		azSubscriptionID: "subid",
		appbox: &regionalpb.APPBox{
			Kubernetes: &regionalpb.APPBox_Kubernetes{
				Vpc: "vpcid",
				Info: &regionalpb.APPBox_Kubernetes_Azure_{
					Azure: &regionalpb.APPBox_Kubernetes_Azure{
						ResourceGroup: "test-group",
					}},
			}},
	}
	dns := &DNSRequest{
		Name:           "dns-name",
		RootDomainName: "11.tidbcloud.com",
		Endpoint: &SinkEndpoint{
			Address: "1.2.3.4",
		},
	}
	obj, err := provider.BuildDNS("config-name", dns)
	require.Nil(t, err)
	require.Len(t, obj, 3)
	privateZone := obj[0].(*netv1beta1.PrivateDNSZone)
	require.Equal(t, "config-name", privateZone.Spec.ProviderConfigReference.Name)
	require.Equal(t, "dns-name", privateZone.Name)
	require.Equal(t, "11.tidbcloud.com", privateZone.Annotations[crossplaneExternalName])
	vnetlink := obj[1].(*netv1beta1.PrivateDNSZoneVirtualNetworkLink)
	require.Equal(t, "dns-name", vnetlink.Name)
	dnsrecord := obj[2].(*netv1beta1.PrivateDNSARecord)
	require.Equal(t, "dns-name", dnsrecord.Name)
	require.Equal(t, "*", dnsrecord.Annotations[crossplaneExternalName])
	require.Equal(t, "1.2.3.4", *dnsrecord.Spec.ForProvider.Records[0])
	require.Equal(t, "/subscriptions/subid/resourceGroups/test-group/providers/Microsoft.Network/virtualNetworks/vpcid", *vnetlink.Spec.ForProvider.VirtualNetworkID)
}

func TestAzureBuildSinkEndpoint(t *testing.T) {
	provider := &azure{
		azSubscriptionID: "subid",
		appbox: &regionalpb.APPBox{
			Kubernetes: &regionalpb.APPBox_Kubernetes{
				Vpc: "vpcid",
				Info: &regionalpb.APPBox_Kubernetes_Azure_{
					Azure: &regionalpb.APPBox_Kubernetes_Azure{
						ResourceGroup: "test-group",
						NodeSubnets: []*regionalpb.APPBox_Kubernetes_AzureSubnet{
							{
								Id: "subnetid",
							},
						},
					}},
			}},
	}
	endpoint := &EndpointRequest{
		CloudEndpointName:   "endpoint-name",
		EndpointServiceName: "serviceName",
	}
	obj, err := provider.BuildSinkEndpoint("config-name", types.NamespacedName{Name: "endpoint-name", Namespace: "namespace"}, endpoint)
	require.Nil(t, err)
	privateEndpoint := obj[0].(*netv1beta1.PrivateEndpoint)
	require.Equal(t, "config-name", privateEndpoint.Spec.ProviderConfigReference.Name)
	require.Equal(t, "subnetid", *privateEndpoint.Spec.ForProvider.SubnetID)
	require.Equal(t, "test-group", *privateEndpoint.Spec.ForProvider.ResourceGroupName)
	serviceConnections := privateEndpoint.Spec.ForProvider.PrivateServiceConnection
	require.Len(t, serviceConnections, 1)
	require.True(t, *serviceConnections[0].IsManualConnection)
	require.Equal(t, "endpoint-name", *serviceConnections[0].Name)
	require.Equal(t, "serviceName", *serviceConnections[0].PrivateConnectionResourceAlias)
}
