package nodepoolgc

import (
	"context"
	"strings"

	gkev1beta1 "github.com/crossplane-contrib/provider-gcp/apis/container/v1beta1"
	"sigs.k8s.io/controller-runtime/pkg/client"

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

const gkeNodePoolLabelKey = "cloud.google.com/gke-nodepool"

type gcpProvider struct {
	local client.Client
}

var _ CloudProvider = (*gcpProvider)(nil)

func (p *gcpProvider) Name() string {
	return "GCP"
}

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

func (p *gcpProvider) ListNodePools(ctx context.Context) ([]nodePool, error) {
	var list gkev1beta1.NodePoolList
	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]
		pools = append(pools, newNodePool(
			pool,
			consts.ProviderTypeGKE,
			regionFromGCPCluster(pool.Spec.ForProvider.Cluster),
			resourceName(pool.Spec.ForProvider.Cluster),
		))
	}
	return pools, nil
}

func resourceName(resourceID string) string {
	parts := strings.Split(strings.Trim(resourceID, "/"), "/")
	if len(parts) == 0 {
		return ""
	}
	return parts[len(parts)-1]
}

func regionFromGCPCluster(cluster string) string {
	parts := strings.Split(cluster, "/")
	if len(parts) == 6 &&
		parts[0] == "projects" &&
		parts[1] != "" &&
		parts[2] == "locations" &&
		parts[3] != "" &&
		parts[4] == "clusters" && parts[5] != "" {
		return parts[3]
	}
	return ""
}
