package network

import (
	"context"

	"github.com/pingcap/errors"
	"github.com/pingcap/tidb-operator/pkg/apis/pingcap/v1alpha1"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/shared-provider/pkg/utils/namespace"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

// NetworkClusters return the clusters belong to the specify network.
func NetworkClusters(
	ctx context.Context,
	cli client.Reader,
	net *cloudv1.Network,
) (clusters []cloudv1.Cluster, err error) {
	cl := cloudv1.ClusterList{}
	err = cli.List(ctx, &cl, client.InNamespace(net.Namespace))
	if err != nil {
		return nil, errors.Annotate(err, "failed to list clusters")
	}

	for _, c := range cl.Items {
		if c.Spec.NetworkName == net.Name {
			clusters = append(clusters, c)
		}
	}

	return
}

func (r *Reconciler) isResourceCleaned(ctx context.Context, net *cloudv1.Network) (bool, error) {
	// check infra cluster whether infra cluster is cleaned
	clusters, err := NetworkClusters(ctx, r.InfraCache, net)
	if err != nil {
		return false, err
	}
	if len(clusters) != 0 {
		return false, nil
	}

	// check workload cluster whether backup is cleaned
	ns := namespace.GetOwnedNamespaceNameFromNetwork(net)
	bl := v1alpha1.BackupList{}
	if err := r.Cache.List(ctx, &bl, client.InNamespace(ns)); err != nil {
		return false, err
	}
	if len(bl.Items) != 0 {
		return false, nil
	}

	return true, nil
}
