package eks

import (
	"context"
	"time"

	"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"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/deploy"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/helm"
	"github.com/tidbcloud/infra-provider/regional-server/pkg/util"
	"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 {
	name := t.config.GetName()
	if t.config.HelmValues != nil {
		if override, ok := t.config.HelmValues["nameOverride"]; ok {
			if nameOverride, ok := override.(string); ok && nameOverride != "" {
				name = nameOverride
			}
		}
	}
	return deploy.ErrorOrDone(controllers.EnsureChartDeploymentReady(ctx, t.Remote, types.NamespacedName{
		Namespace: t.config.GetNamespace(),
		Name:      name,
	}))
}
