package task

import (
	"context"

	agentv2 "github.com/tidbcloud/observability/agent-control-server/api/v2"
	"github.com/tidbcloud/observability/agent-control-server/controllers/o11yk8sagent/metadata"
	"github.com/tidbcloud/observability/agent-control-server/pkg/commontasks"
	"github.com/tidbcloud/observability/agent-control-server/pkg/consts"
	"github.com/tidbcloud/observability/agent-control-server/pkg/deploy"
	"github.com/tidbcloud/observability/agent-control-server/pkg/reconciler"
)

const (
	defaultMaxSpec = "medium"
)

type AutoResourcingTask struct {
	*reconciler.BaseTask[*agentv2.O11yK8sAgent]
}

func NewAutoResourcingTask(ctx *reconciler.Context[*agentv2.O11yK8sAgent]) *AutoResourcingTask {
	return &AutoResourcingTask{
		BaseTask: &reconciler.BaseTask[*agentv2.O11yK8sAgent]{Context: ctx},
	}
}

func (t *AutoResourcingTask) Name() string {
	return "AutoResourcing"
}

func (t *AutoResourcingTask) ClusterMeta() deploy.ClusterMeta {
	return metadata.ClusterMeta(t.Agent)
}

func (t *AutoResourcingTask) Create(ctx context.Context) deploy.Result {
	return deploy.PanicOrDone(commontasks.ReconcileAutoResourcing(
		ctx,
		t.Config.O11yConfig.CustomerConfigsV2.Dedicated.Specs.K8s,
		t.Agent,
		t.Agent.Spec.KubernetesClusterName,
		consts.AgentO11yK8s,
		defaultMaxSpec,
		map[string]string{
			consts.TagKeyTenant:  t.Agent.Spec.O11y.TenantID,
			consts.TagKeyProject: t.Agent.Spec.O11y.ProjectID,
		},
		t.Local,
	))
}
