package task

import (
	"context"

	agentv2 "github.com/tidbcloud/observability/agent-control-server/api/v2"
	"github.com/tidbcloud/observability/agent-control-server/controllers/o11ytidbagent/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 = "large"
)

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

func NewAutoResourcingTask(ctx *reconciler.Context[*agentv2.O11yTiDBAgent]) *AutoResourcingTask {
	return &AutoResourcingTask{
		BaseTask: &reconciler.BaseTask[*agentv2.O11yTiDBAgent]{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.TiDBCluster,
		t.Agent,
		t.Agent.Spec.KubernetesClusterName,
		consts.AgentO11yTidb,
		defaultMaxSpec,
		map[string]string{consts.TagKeyCluster: t.Agent.Name},
		t.Local,
	))
}
