package nodepoolgc

import (
	"context"

	"github.com/pingcap/errors"
	"sigs.k8s.io/controller-runtime/pkg/client"

	"github.com/tidbcloud/infra-provider/pkg/consts"
	"github.com/tidbcloud/infra-provider/pkg/namer"
)

// CloudProvider isolates cloud-specific discovery and dataplane access from
// the GC lifecycle.
type CloudProvider interface {
	Name() string
	ListNodePools(context.Context) ([]nodePool, error)
	NodeSelector(nodePool) map[string]string
}

func newCloudProvider(
	providerType string,
	local client.Client,
) (CloudProvider, error) {
	switch providerType {
	case consts.ProviderTypeEKS:
		return &awsProvider{local: local}, nil
	case consts.ProviderTypeGKE:
		return &gcpProvider{local: local}, nil
	case consts.ProviderTypeAKS:
		return &azureProvider{local: local}, nil
	default:
		return nil, errors.Errorf("unsupported BR nodepool GC provider %q", providerType)
	}
}

func newNodePool(obj client.Object, provider, region, kubernetesName string) nodePool {
	return nodePool{primary: obj, provider: provider, region: region, kubernetesName: kubernetesName}
}

func dataplaneNodeSelector(pool nodePool, nodePoolLabelKey string) map[string]string {
	return map[string]string{
		namer.ComponentSelectorKey: pool.component(),
		nodePoolLabelKey:           pool.primary.GetName(),
	}
}
