package routing

// Strategy defines how requests are routed to providers.
// Uses kebab-case consistently for JSON/config serialization.
//
// IMPORTANT: Use the constants below, not string literals.
// This enables compile-time checking and refactoring support.
type Strategy string

const (
	// StrategyPrimaryOnly uses only the first provider, failing immediately on error.
	// Use when you want deterministic behavior with no automatic failover.
	// The provider is NOT put in cooldown on failure.
	StrategyPrimaryOnly Strategy = "primary-only"

	// StrategyFallback tries providers in order until one succeeds.
	//
	// CRITICAL: The LAST provider in the chain (terminus) is ALWAYS attempted
	// regardless of cooldown state. This is the fallback of last resort.
	//
	// Providers that fail with rate-limit or transient errors enter cooldown
	// and will be skipped on subsequent requests until the cooldown expires.
	// The terminus never enters cooldown.
	StrategyFallback Strategy = "fallback"

	// StrategyRoundRobin distributes requests across providers evenly.
	// Uses atomic counter to rotate through providers.
	// Does NOT respect cooldowns; each call rotates to the next provider.
	StrategyRoundRobin Strategy = "round-robin"
)

// Valid returns true if the strategy is recognized.
func (s Strategy) Valid() bool {
	switch s {
	case StrategyPrimaryOnly, StrategyFallback, StrategyRoundRobin:
		return true
	default:
		return false
	}
}

// String returns the strategy value as a string.
func (s Strategy) String() string {
	return string(s)
}
