package commontasks

import (
	"context"

	"sigs.k8s.io/controller-runtime/pkg/client"

	"github.com/tidbcloud/observability/agent-control-server/pkg/agentbuild"
	"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"
)

type PriorityClassTask[T client.Object] struct {
	*reconciler.BaseTask[T]
	cm deploy.ClusterMeta
}

func NewPriorityClassTask[T client.Object](ctx *reconciler.Context[T], cm deploy.ClusterMeta) *PriorityClassTask[T] {
	return &PriorityClassTask[T]{
		BaseTask: &reconciler.BaseTask[T]{Context: ctx},
		cm:       cm,
	}
}

func (t *PriorityClassTask[T]) Name() string {
	return "PriorityClass"
}

func (t *PriorityClassTask[T]) ClusterMeta() deploy.ClusterMeta {
	return t.cm
}

func (t *PriorityClassTask[T]) Create(ctx context.Context) deploy.Result {
	cli, err := t.Remote.GetClient(ctx)
	if err != nil {
		return deploy.Panic(err)
	}
	if err := agentbuild.CreateAgentPriorityClass(ctx, cli, consts.PriorityClassNameNodeCritical); err != nil {
		return deploy.Panic(err)
	}
	if err := agentbuild.CreateAgentPriorityClassWithValue(ctx, cli, consts.PriorityClassNameNodeNonCritical, -1); err != nil {
		return deploy.Panic(err)
	}
	if err := agentbuild.CreateAgentPriorityClass(ctx, cli, consts.PriorityClassNameClusterCritical); err != nil {
		return deploy.Panic(err)
	}
	return deploy.Done()
}
