package cluster

import (
	"github.com/pingcap/errors"
	agentv1 "github.com/tidbcloud/observability/agent-control-server/api/v1"

	"github.com/tidbcloud/eks-provider/api/v1alpha1"
	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	"github.com/tidbcloud/infra-provider/pkg/consts"
	"github.com/tidbcloud/infra-provider/pkg/util"
)

func BuildEKSDataplaneConfig(network *cloudv1.Network, networkSpec *v1alpha1.EKSNetworkSpec) (agentv1.DataPlaneConfigType, error) {
	clusterName := util.GetAnnotation(network, consts.AnnotationKeyDataplaneName)
	if clusterName == "" {
		return agentv1.DataPlaneConfigType{}, errors.New("cluster name not found")
	}

	provider := consts.ProviderTypeEKS
	agentAccessArn := networkSpec.NodeRoleArn
	agentManagerArn := util.GetRootUserARN(networkSpec.AssumeRoleArn)
	dct := agentv1.DataPlaneConfigType{
		Cluster:         clusterName,
		Provider:        provider,
		AgentAccessARN:  agentAccessArn,
		AgentManagerARN: agentManagerArn,
	}

	return dct, nil
}

func BuildGKEDataplaneConfig(network *cloudv1.Network, networkSpec *v1alpha1.GKENetworkSpec) (agentv1.DataPlaneConfigType, error) {
	clusterName := util.GetAnnotation(network, consts.AnnotationKeyDataplaneName)
	if clusterName == "" {
		return agentv1.DataPlaneConfigType{}, errors.New("cluster name not found")
	}
	if network.Status.IAM.ServiceAccountEmail == "" {
		return agentv1.DataPlaneConfigType{}, errors.New("service account email not found")
	}
	provider := consts.ProviderTypeGKE
	agentAccessARN := network.Status.IAM.ServiceAccountEmail
	agentManagerARN := networkSpec.ProjectID

	return agentv1.DataPlaneConfigType{
		Cluster:         clusterName,
		Provider:        provider,
		AgentAccessARN:  agentAccessARN,
		AgentManagerARN: agentManagerARN,
	}, nil
}
