package scale

import (
	"context"
	"errors"

	appworkflow "github.com/tidbcloud/serverless-service/internal/workflow"
	"github.com/tidbcloud/serverless-service/internal/workflow/action"
	workflowchangefeed "github.com/tidbcloud/serverless-service/internal/workflow/action/changefeed"
	"go.uber.org/zap"
)

type ActionScaleCluster struct {
	scheduler workflowchangefeed.Scheduler
}

func NewScaleClusterAction(scheduler workflowchangefeed.Scheduler) *action.Wrapper {
	return action.MustNewActionWrapper(appworkflow.ActionScaleNewArchCluster, &ActionScaleCluster{scheduler: scheduler})
}

func (a *ActionScaleCluster) Params() any {
	return &workflowchangefeed.CommonParams{}
}

func (a *ActionScaleCluster) Run(ctx context.Context, logger *zap.Logger, params any) error {
	input := params.(*workflowchangefeed.CommonParams)
	logger.Info("scaling shared newarch cluster")
	return a.scheduler.ScaleChangefeedResource(ctx, input.ClusterID, input.ChangefeedID)
}

func (a *ActionScaleCluster) RunAfter(ctx context.Context, logger *zap.Logger, params any) error {
	input := params.(*workflowchangefeed.CommonParams)
	ready, err := a.scheduler.IsChangefeedResourceReady(ctx, input.ClusterID, input.ChangefeedID)
	if err != nil {
		return err
	}
	if !ready {
		return errors.New("newarch changefeed resource is not ready yet")
	}
	return nil
}
