package nodepoolgc

import (
	"context"

	ec2v1alpha1 "github.com/crossplane-contrib/provider-aws/apis/ec2/v1alpha1"
	"github.com/crossplane-contrib/provider-aws/apis/eks/manualv1alpha1"
	apierrors "k8s.io/apimachinery/pkg/api/errors"
	"sigs.k8s.io/controller-runtime/pkg/client"

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

const eksNodeGroupLabelKey = "eks.amazonaws.com/nodegroup"

type awsProvider struct {
	local client.Client
}

var _ CloudProvider = (*awsProvider)(nil)

func (p *awsProvider) Name() string {
	return "AWS"
}

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

func (p *awsProvider) ListNodePools(ctx context.Context) ([]nodePool, error) {
	var list manualv1alpha1.NodeGroupList
	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 {
		nodeGroup := &list.Items[i]
		pool := newNodePool(nodeGroup, consts.ProviderTypeEKS, nodeGroup.Spec.ForProvider.Region, nodeGroup.Spec.ForProvider.ClusterName)
		launchTemplate := &ec2v1alpha1.LaunchTemplate{}
		err := p.local.Get(ctx, client.ObjectKeyFromObject(nodeGroup), launchTemplate)
		if err == nil {
			pool.companions = append(pool.companions, launchTemplate)
		} else if !apierrors.IsNotFound(err) {
			return nil, err
		}
		pools = append(pools, pool)
	}
	return pools, nil
}
