package config

import (
	"fmt"
	"net/url"
	"strings"
)

// ConfigValidator valide la configuration selon des règles strictes (T0036)
type ConfigValidator struct{}

// NewConfigValidator crée un nouveau validateur
func NewConfigValidator() *ConfigValidator {
	return &ConfigValidator{}
}

// ValidatePort valide qu'un port est dans la plage valide (1-65535)
func (v *ConfigValidator) ValidatePort(port int) error {
	if port < 1 || port > 65535 {
		return fmt.Errorf("port must be between 1 and 65535, got %d", port)
	}
	return nil
}

// ValidateURL valide qu'une URL a le schéma attendu
func (v *ConfigValidator) ValidateURL(urlStr, expectedScheme string) error {
	if urlStr == "" {
		return fmt.Errorf("URL cannot be empty")
	}

	parsedURL, err := url.Parse(urlStr)
	if err != nil {
		return fmt.Errorf("invalid URL format: %w", err)
	}

	if parsedURL.Scheme != expectedScheme {
		return fmt.Errorf("URL must have scheme %s, got %s", expectedScheme, parsedURL.Scheme)
	}

	return nil
}

// ValidateEnum valide qu'une valeur fait partie des valeurs autorisées
func (v *ConfigValidator) ValidateEnum(value string, allowed []string) error {
	for _, allowedValue := range allowed {
		if value == allowedValue {
			return nil
		}
	}
	return fmt.Errorf("value '%s' is not allowed. Allowed values: %s", value, strings.Join(allowed, ", "))
}

// ValidateSecretLength valide qu'un secret a une longueur minimale
func (v *ConfigValidator) ValidateSecretLength(secret string, minLength int) error {
	if len(secret) < minLength {
		return fmt.Errorf("secret must be at least %d characters, got %d", minLength, len(secret))
	}
	return nil
}

// ValidatePositiveInt valide qu'un entier est positif
func (v *ConfigValidator) ValidatePositiveInt(value int, fieldName string) error {
	if value <= 0 {
		return fmt.Errorf("%s must be positive, got %d", fieldName, value)
	}
	return nil
}
