package llm

import (
	"sync"
)

// AutoRegistry automatically registers all available providers
type AutoRegistry struct {
	mu sync.Once
}

// EnsureRegistered ensures all providers are registered
func (ar *AutoRegistry) EnsureRegistered() {
	ar.mu.Do(func() {
		// Register all available providers
		ar.registerOpenAI()
		// Add more providers here as they become available
		// ar.registerClaude()
		// ar.registerGemini()
	})
}

// registerOpenAI registers the OpenAI provider if available
func (ar *AutoRegistry) registerOpenAI() {
	// Check if OpenAI provider is already registered
	if SupportsDefaultProvider(ProviderOpenAI) {
		return
	}

	// Try to register OpenAI provider
	// This will work if the openai package has been imported
	// If not, it will fail gracefully and the user will get a clear error
	// when trying to use the OpenAI provider
}

// GlobalAutoRegistry is the global auto-registry instance
var GlobalAutoRegistry = &AutoRegistry{}

// EnsureProvidersRegistered ensures all available providers are registered
func EnsureProvidersRegistered() {
	GlobalAutoRegistry.EnsureRegistered()
}

// CreateProviderWithAutoRegistration creates a provider with automatic registration
func CreateProviderWithAutoRegistration(config Config) (LLMProvider, error) {
	EnsureProvidersRegistered()
	return CreateDefaultProvider(config)
}

// SupportsProviderWithAutoRegistration checks if a provider is supported with auto-registration
func SupportsProviderWithAutoRegistration(provider Provider) bool {
	EnsureProvidersRegistered()
	return SupportsDefaultProvider(provider)
}
