package job

import (
	"context"

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

	eksv1alpha1 "github.com/tidbcloud/eks-provider/api/v1alpha1"
	"github.com/tidbcloud/eks-provider/controllers/tiflow/spec"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/util/collections"
)

type ClusterMaster struct {
	*BaseTask
}

func NewClusterMaster(ctx *Context) *ClusterMaster {
	return &ClusterMaster{BaseTask: &BaseTask{Context: ctx}}
}

func (t *ClusterMaster) Name() string {
	return "ClusterMaster"
}

func (t *ClusterMaster) Create(ctx context.Context) deploy.Result {
	obj := &eksv1alpha1.TiflowClusterMasterManager{}
	obj.Namespace = t.Network.Namespace
	obj.Name = t.Namer.GetTiflowClusterMasterManagerName()

	_, err := controllerutil.CreateOrUpdate(ctx, t.Local, obj, func() error {
		obj.Spec.NetworkName = t.Network.Name
		if obj.Labels == nil {
			obj.Labels = make(map[string]string)
		}
		labelOfTiDBClusterName := spec.GetTiDBClusterNameLabel(&(t.TiflowJob.ObjectMeta))
		labelFromConfig := t.Config.GenerateLabelFromConfig()
		obj.Labels = collections.MergeMaps(obj.Labels, labelFromConfig, labelOfTiDBClusterName)
		obj.Labels[eksv1alpha1.TiflowMasterManagerTypeLabelKey] = t.Namer.GetTiflowClusterMasterManagerType()
		return nil
	})
	return deploy.ErrorOrDone(err)
}
