package nodepoolgc

import (
	"context"

	azurev1beta1 "github.com/upbound/provider-azure/apis/containerservice/v1beta1"
	"sigs.k8s.io/controller-runtime/pkg/client"

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

const aksAgentPoolLabelKey = "kubernetes.azure.com/agentpool"

type azureProvider struct {
	local client.Client
}

var _ CloudProvider = (*azureProvider)(nil)

func (p *azureProvider) Name() string {
	return "Azure"
}

func (p *azureProvider) NodeSelector(pool nodePool) map[string]string {
	return dataplaneNodeSelector(pool, aksAgentPoolLabelKey)
}

func (p *azureProvider) ListNodePools(ctx context.Context) ([]nodePool, error) {
	var list azurev1beta1.KubernetesClusterNodePoolList
	if err := sharednodepoolgc.ListBRNodePools(ctx, p.local, &list); err != nil {
		return nil, err
	}

	pools := make([]nodePool, 0, len(list.Items))
	for i := range list.Items {
		pool := &list.Items[i]
		kubernetesName := ""
		if pool.Spec.ForProvider.KubernetesClusterID != nil {
			kubernetesName = resourceName(*pool.Spec.ForProvider.KubernetesClusterID)
		}
		pools = append(pools, newNodePool(pool, consts.ProviderTypeAKS, "", kubernetesName))
	}
	return pools, nil
}
