package resourcepool

import (
	"context"
	"fmt"
	"strconv"

	"github.com/tidbcloud/tiinf/monitor/tilog"
	"go.uber.org/zap"

	globalngv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/nextgen/v1"
	"github.com/tidbcloud/tidb-management-service/utilities/grpc/metadata"
)

func (w *worker) HandleAutomaticResumeResourcePools(ctx context.Context) error {
	poolIDs, berr := w.resourcePoolRepo.ListDueAutomaticResume(ctx)
	if berr != nil {
		tilog.Error(ctx, "failed to list resource pools due for automatic resume", zap.Error(berr))
		return fmt.Errorf("list resource pools due for automatic resume: %w", berr)
	}

	for _, poolID := range poolIDs {
		operationID := strconv.FormatUint(w.idGenerator.MustNew(), 10)
		// Workflow creation serializes the request metadata into the DAG. The
		// automatic-resume worker has no user request context, so carry the pool
		// identity as internal metadata instead of requiring a user principal.
		workerCtx := metadata.AppendToOutgoingMeta(ctx, &metadata.RequestMeta{
			ResourceID:        strconv.FormatUint(poolID, 10),
			NoProjectRequired: true,
		})
		_, berr := w.resourcePoolSvc.ResumeResourcePool(workerCtx, &globalngv1.ResumeResourcePoolRequest{
			ResourcePoolId: poolID,
			OperationId:    operationID,
		})
		if berr != nil {
			tilog.Error(ctx, "failed to automatically resume resource pool",
				zap.Uint64("resource_pool_id", poolID),
				zap.String("operation_id", operationID),
				zap.Error(berr),
			)
		}
	}

	return nil
}
