package aks

import (
	"context"

	xpv1 "github.com/crossplane/crossplane-runtime/apis/common/v1"
	o11yv2 "github.com/tidbcloud/observability/agent-control-server/api/v2"

	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/appbox/task"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/appbox/task/common"
)

type aksProvider struct{}

func (aksProvider) FillProviderSpec(_ context.Context, t *task.BaseTask, spec *o11yv2.KubernetesAgentSpec) error {
	resourceGroup := t.VPC.Status.ResourceGroup.ID
	if resourceGroup == "" {
		resourceGroup = controllers.GetResourceGroupName(t.VPC, t.Config.ResourceNamePrefix)
	}

	spec.AKS = &o11yv2.AKSConfig{
		SubscriptionID: t.VPC.Spec.AccountRef.AccountID,
		Network:        t.VPC.Status.VPC.VPCID,
		SubnetID:       getNodeSubnetID(t),
		ResourceGroup:  resourceGroup,
		ProviderConfigReference: &xpv1.Reference{
			Name: t.VPC.Spec.AccountRef.ProviderConfigName,
		},
	}
	return nil
}

func getNodeSubnetID(t *task.BaseTask) string {
	if len(t.VPC.Status.NodeSubnets) > 0 {
		return t.VPC.Status.NodeSubnets[0].SubnetID
	}
	return ""
}

// NewO11yProvider returns the AKS provider implementation for common O11y task.
func NewO11yProvider() common.Provider { return aksProvider{} }
