package branch

import (
	"github.com/pingcap/errors"
	"github.com/tidbcloud/aws-shared-provider/pkg/metrics"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

func (r *reconcileContext) pendingDeleteBranch() error {
	if names, err := r.getImportNames(); err != nil {
		return err
	} else if len(names) > 0 {
		if err := r.deleteImports(names); err != nil {
			return err
		} else {
			return errors.Errorf("wait for imports %v to be removed", names)
		}
	}

	return r.updateProgress(cloudv1.BranchPhaseDeleting, "branch is being deleted")
}

func (r *reconcileContext) getImportNames() ([]string, error) {
	var importList cloudv1.ImportList
	if err := r.InfraClient.List(r.ctx, &importList, client.InNamespace(r.branch.Namespace),
		client.MatchingFields(map[string]string{
			"spec.clusterName": r.branch.Name,
		})); err != nil {
		return nil, err
	}
	var names []string
	for _, item := range importList.Items {
		names = append(names, item.Name)
	}
	return names, nil
}

func (r *reconcileContext) deleteImports(names []string) error {
	// most of the time there is usually only one Import, so no need to delete them concurrently
	for _, name := range names {
		if err := r.InfraClient.Delete(r.ctx, &cloudv1.Import{
			ObjectMeta: metav1.ObjectMeta{
				Name:      name,
				Namespace: r.branch.Namespace,
			},
		}); client.IgnoreNotFound(err) != nil {
			return err
		}
	}
	return nil
}

func (r *reconcileContext) deleteBranch() error {
	if r.O11yAgentEnabled {
		if err := r.deleteO11yCluster(); err != nil {
			return err
		}
	}
	if err := r.deleteServerlessTidbCluster(); err != nil {
		return err
	}
	if err := r.deleteMetrics(); err != nil {
		return err
	}
	return nil
}

func (r *reconcileContext) deleteMetrics() error {
	if r.keyspaceToken != "" {
		metrics.Reclaimer.DeleteVec(metrics.AssignTidbHistogramName, r.keyspaceToken)
		metrics.Reclaimer.DeleteVec(metrics.ActivatorHistogramName, r.keyspaceToken)
	}
	metrics.Reclaimer.DeleteVec(metrics.ClusterCreationHistogramName, r.branch.Name)

	return nil
}
