package regionaction

import (
	"context"
	"fmt"
	"strings"
	"time"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	regionalv1 "github.com/tidbcloud/infra-provider/api/tidbcloud/regional-server/v1"

	opent "github.com/tidbcloud/devops/entity/operation"
	"github.com/tidbcloud/devops/pkg/service/operation/actions"
)

var (
	ActionUpgradeAdminNodes = opent.ActionMetadata{
		Name: "UpgradeAdminNodes",
		Type: opent.ActionTypeAuto,
	}
)

type upgradeAdminNodes struct {
	upgradeBase
}

func NewUpgradeAdminNodes(comps *actions.Components) actions.AutoAction {
	return &upgradeAdminNodes{upgradeBase{comps: comps}}
}

func (a *upgradeAdminNodes) Metadata() opent.ActionMetadata {
	return ActionUpgradeAdminNodes
}

func (a *upgradeAdminNodes) PreCheck(_ context.Context, _ *opent.Instance) error {
	return nil
}

func (a *upgradeAdminNodes) Start(ctx context.Context, instance *opent.Instance) (*actions.ActionResult, error) {
	return a.upgradeBase.Start(ctx, instance, a.buildRequest)
}

func (a *upgradeAdminNodes) Result(ctx context.Context, instance *opent.Instance) (*actions.ActionResult, error) {
	return a.upgradeBase.Result(ctx, instance)
}

func (a *upgradeAdminNodes) buildRequest(instance *opent.Instance, info *regionalv1.K8SInformation) (*regionalv1.CreateUpgradeOperationRequest, error) {
	desiredVersion, _ := instance.GetParam(opent.ParamDesiredVersion)
	if desiredVersion == "" {
		return nil, fmt.Errorf("desired_version is required")
	}

	key := fmt.Sprintf("devops-%s-%v", strings.ToLower(string(a.Metadata().Name)), instance.ID)
	schedule := time.Now().Add(1 * time.Minute).Format(cloudv1.UpgradeOperationScheduleLayout)
	return &regionalv1.CreateUpgradeOperationRequest{
		UpgradeOperation: &regionalv1.UpgradeOperation{
			Name:       key,
			AppboxName: info.AppboxName,
			Duration:   fmt.Sprintf("%dm", len(info.AdminNodes)*5),
			Ttl:        defaultTTL,
			Schedule:   schedule,
			Steps: []*regionalv1.UpgradeStep{
				{
					Target:  string(cloudv1.AdminNodes),
					Version: desiredVersion,
				},
			},
		},
	}, nil
}
