package podautoscaler

import (
	"context"

	resourceclient "k8s.io/metrics/pkg/client/clientset/versioned/typed/metrics/v1beta1"
	"sigs.k8s.io/controller-runtime/pkg/client"

	"github.com/tidbcloud/observability/agent-control-server/pkg/config"
)

type agentResourceUpdater struct {
	kubernetesVmagent *resourceUpdater
	sharedpoolVmagent *resourceUpdater
	sharedpoolVector  *resourceUpdater
	tidbgroupVector   *resourceUpdater
}

type resourceUpdater struct {
	cli         client.Client
	clusterName string
	component   string
	updateFunc  updateResourceFunc
	specRange   specRange
	*resourceCalculator
}

func newResourceUpdater(
	cli client.Client,
	metricsCli resourceclient.MetricsV1beta1Interface,
	clusterName string,
	namespace string,
	matchingLabels map[string]string,
	autoscalerConfig config.AutoScaler,
	updateFunc updateResourceFunc,
	specRange specRange,
	component string,
) *resourceUpdater {
	return &resourceUpdater{
		cli:                cli,
		clusterName:        clusterName,
		updateFunc:         updateFunc,
		specRange:          specRange,
		component:          component,
		resourceCalculator: newResourceCalculator(metricsCli, cli, clusterName, namespace, matchingLabels, autoscalerConfig),
	}
}

// UpdateRefResources updates the resources of the agent referenced by the pod.
// It first retrieves the agent reference from the pod's labels, then calls the update function.
func (ru *resourceUpdater) UpdateRefResources(ctx context.Context, scaleResult ScaleResult) error {
	return ru.updateFunc(ctx, ru.clusterName, ru.component, scaleResult, ru.specRange)
}
