package network

import (
	"context"
	"testing"

	"github.com/stretchr/testify/assert"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	k8sruntime "k8s.io/apimachinery/pkg/runtime"

	"github.com/pingcap/tidb-operator/pkg/apis/pingcap/v1alpha1"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/shared-provider/pkg/types"
	"github.com/tidbcloud/shared-provider/pkg/utils/namespace"
)

func TestUtil(t *testing.T) {
	var (
		net = &cloudv1.Network{
			ObjectMeta: metav1.ObjectMeta{
				Namespace: "network-ns1",
				Name:      "util-network",
				Labels: map[string]string{
					"tags.tidbcloud.com/kubernetes": kubeClusterName,
				},
			},
			Spec: cloudv1.NetworkSpec{
				Provider: types.ProviderTypeAWSSharedTier,
				Region:   region,
				CIDR:     cidr,
			},
		}

		cluster = &cloudv1.Cluster{ // reconcile with cluster
			ObjectMeta: metav1.ObjectMeta{
				Namespace: net.Namespace,
				Name:      "cluster1",
			},
			Spec: cloudv1.ClusterSpec{
				NetworkName: net.Name,
			},
		}

		backup = &v1alpha1.Backup{
			ObjectMeta: metav1.ObjectMeta{
				Namespace: namespace.GetOwnedNamespaceNameFromNetwork(net),
				Name:      "backup1",
			},
		}

		objs      []k8sruntime.Object
		infraObjs = []k8sruntime.Object{net}
	)

	r := newFakeReconciler(objs, infraObjs)
	cleaned, err := r.isResourceCleaned(context.Background(), net)
	assert.NoError(t, err)
	assert.True(t, cleaned)

	// has cluster in infra API server
	r = newFakeReconciler(objs, append(infraObjs, cluster))
	cleaned, err = r.isResourceCleaned(context.Background(), net)
	assert.NoError(t, err)
	assert.False(t, cleaned)

	// has backup in workload cluster server
	r = newFakeReconciler(append(objs, backup), infraObjs)
	cleaned, err = r.isResourceCleaned(context.Background(), net)
	assert.NoError(t, err)
	assert.False(t, cleaned)
}
