package region

import (
	"context"
	"strconv"

	"github.com/tidbcloud/fastflow/pkg/entity"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	workflowcommon "github.com/tidbcloud/tidb-management-service/nextgen-global-service/domain/service/workflow/common"
	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
	utilworkflow "github.com/tidbcloud/tidb-management-service/utilities/workflow"
)

const (
	byocVcpuPoolModifyingBlockingReason = "byoc vcpu pool is modifying"
	scaleByocSharedComponentsInProgress = "scale operation already in progress for resource pool %d"
)

func (s *service) hasRunningScaleWorkflow(ctx context.Context, resourcePoolID uint64) (bool, bizerr.BizError) {
	if s.workflow == nil {
		return false, bizerr.New(bizerr.ErrCodeUnknown, "workflow is not configured")
	}

	instances, err := s.workflow.ListRunningDagInstances(
		ctx,
		[]string{workflowcommon.ScaleByocSharedComponents},
		strconv.FormatUint(resourcePoolID, 10),
	)
	if err != nil {
		return false, bizerr.WrapError(err, "failed to list running scale workflow for resource pool %d", resourcePoolID)
	}

	return len(instances) > 0, nil
}

func byocVcpuPoolRunningWorkflowMap(instances []*entity.DagInstance) map[string]struct{} {
	running := make(map[string]struct{}, len(instances))
	for _, instance := range instances {
		for _, tag := range instance.Tags {
			if tag.Key == utilworkflow.BizIdKey {
				running[tag.Value] = struct{}{}
				break
			}
		}
	}
	return running
}

func blockPreviewForModifyingPool(preview *globalngv1.ByocSharedComponentScalePreviewSummary) {
	if preview == nil {
		return
	}
	preview.Allowed = false
	preview.BlockingReasons = stableUniqueStrings(append(
		preview.GetBlockingReasons(),
		byocVcpuPoolModifyingBlockingReason,
	))
}

func newScaleAlreadyInProgressError(resourcePoolID uint64) bizerr.BizError {
	return bizerr.New(bizerr.ErrCodeParams, scaleByocSharedComponentsInProgress, resourcePoolID)
}
