package eks

import (
	"context"
	"time"

	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/pkg/helm"
	"github.com/tidbcloud/infra-provider/pkg/util"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/config"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/controllers/appbox/task"
	"k8s.io/apimachinery/pkg/types"
)

type AWSLBController struct {
	*task.BaseTask
	config *awsLBControllerConfig
}

type awsLBControllerConfig struct {
	config.InfraComponentConfig
	clusterName string
}

func (c *awsLBControllerConfig) ToHelmValues() map[string]interface{} {
	values := map[string]interface{}{
		"clusterName": c.clusterName,
	}

	// Merge values that is determined during runtime with helm values defined in the config template.
	return util.MergeMaps(c.HelmValues, values)
}

func NewAWSLBController(ctx *task.Context) *AWSLBController {
	t := &task.BaseTask{Context: ctx}

	return &AWSLBController{
		BaseTask: t,
		config: &awsLBControllerConfig{
			InfraComponentConfig: ctx.InfraTmplConfig.AWSLoadBalancerController,
		},
	}
}

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

func (t *AWSLBController) Create(ctx context.Context) deploy.Result {
	// TODO: can apply chart again to existed cluster?
	t.BeginAt = util.Pointer(time.Now())
	t.config.clusterName = t.Cluster.GetName()
	return deploy.ErrorOrDone(helm.Apply(ctx, t.Remote, t.config))
}

func (t *AWSLBController) PostCreate(ctx context.Context) deploy.Result {
	return deploy.ErrorOrDone(controllers.EnsureChartDeploymentReady(ctx, t.Remote, types.NamespacedName{
		Namespace: t.config.GetNamespace(),
		Name:      t.config.GetName(),
	}))
}
