package common

import (
	"fmt"
	"strings"

	retry "github.com/avast/retry-go/v4"
)

// ValidateRestoreState validates one restore-progress observation. FAILED and
// canceled terminal states stop polling immediately.
func ValidateRestoreState(state string) error {
	switch strings.TrimPrefix(strings.ToUpper(strings.TrimSpace(state)), "STAGE_") {
	case "SUCCEEDED", "SUCCESS", "COMPLETED":
		return nil
	case "FAILED", "CANCELED", "CANCELLED":
		return retry.Unrecoverable(fmt.Errorf("restore reached terminal state %s", state))
	default:
		return fmt.Errorf("restore state is %s", state)
	}
}

// ValidateRestoreTarget checks the API-normalized target identity. The
// provider and region checks stay in the case because the generated cluster
// response is owned by the serverless-service client.
func ValidateRestoreTarget(servicePlan, provider, wantProvider string, minRCU, maxRCU int64) error {
	if servicePlan != EssentialServicePlan || minRCU != EssentialMinRCU || maxRCU != EssentialMaxRCU {
		return fmt.Errorf("restore target is not an Essential 2000-4000 RCU cluster")
	}
	if !strings.EqualFold(provider, wantProvider) {
		return fmt.Errorf("restore target provider %q, want %q", provider, wantProvider)
	}
	return nil
}
