package commontasks

import (
	"context"

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

	"github.com/tidbcloud/observability/agent-control-server/pkg/deploy"
	"github.com/tidbcloud/observability/agent-control-server/pkg/helmcli"
	"github.com/tidbcloud/observability/agent-control-server/pkg/k8sclient/k8scliv1"
	"github.com/tidbcloud/observability/agent-control-server/pkg/reconciler"
)

type HelmRepoTask[T client.Object] struct {
	*reconciler.BaseTask[T]
	Remote k8scliv1.ClientGetter

	added bool
	cm    deploy.ClusterMeta
	repos map[string]string
}

func NewHelmRepoTask[T client.Object](ctx *reconciler.Context[T], cm deploy.ClusterMeta, repos map[string]string) *HelmRepoTask[T] {
	return &HelmRepoTask[T]{
		BaseTask: &reconciler.BaseTask[T]{Context: ctx},
		Remote:   ctx.Remote,
		cm:       cm,
		repos:    repos,
	}
}

func (t *HelmRepoTask[T]) Name() string {
	return "HelmRepo"
}

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

func (t *HelmRepoTask[T]) Create(ctx context.Context) deploy.Result {
	if t.added {
		return deploy.Done()
	}
	helm, err := helmcli.BuildHelmClient(ctx, t.Remote, "")
	if err != nil {
		return deploy.Panic(err)
	}
	for name, url := range t.repos {
		if err := helmcli.AddOrUpdateChartRepo(helm, name, url); err != nil {
			return deploy.Panic(err)
		}
	}
	t.added = true
	return deploy.Done()
}
