package action

import (
	"fmt"

	"github.com/tidbcloud/fastflow/pkg/entity/run"
	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"
	"google.golang.org/protobuf/encoding/protojson"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/adapter/nextgenglobal"
	"github.com/tidbcloud/tidb-management-service/tidb-mgmt-service/domain/constant"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
	"github.com/tidbcloud/tidb-management-service/utilities/workflow"
)

type DeleteNextGenClusterAction struct {
	nextgenCli nextgenglobal.NextGenGlobal
}

func NewDeleteNextGenClusterAction(nextgenCli nextgenglobal.NextGenGlobal) *DeleteNextGenClusterAction {
	return &DeleteNextGenClusterAction{
		nextgenCli: nextgenCli,
	}
}

func (c *DeleteNextGenClusterAction) Name() string {
	return constant.TaskNextGenGlobalDeleteCluster
}

func (c *DeleteNextGenClusterAction) Run(ctx run.ExecuteContext, params any) error {
	cctx, span := workflow.GenerateContext(ctx)
	defer span.End()

	tilog.Info(cctx, "delete nextgen cluster action start")
	requestJson, ok := ctx.GetVar(constant.KeyRequest)
	if !ok {
		return bizerr.New(bizerr.ErrCodeRecordNotFound, "delete nextgen request is not found")
	}

	var request globalngv1.DeleteClusterRequest
	if err := protojson.Unmarshal([]byte(requestJson), &request); err != nil {
		return bizerr.WrapError(err, "unmarshal delete nextgen request failed")
	}

	request.ValidateOnly = false
	_, err := c.nextgenCli.DeleteCluster(cctx, &request)
	if err != nil {
		if s, ok := status.FromError(err); ok {
			// skip if nextgen cluster is not found
			if s.Code() == codes.Code(bizerr.ErrCodeRecordNotFound) {
				tilog.Warn(
					cctx,
					"nextgen cluster is not found",
					zap.String("cluster_id", fmt.Sprint(request.ClusterId)),
				)
				return nil
			}
		}
		return bizerr.WrapError(err, "delete nextgen cluster failed")
	}

	tilog.Info(cctx, "delete nextgen cluster action end")
	return nil
}
