package config

import (
	"go.uber.org/zap"
)

// ConfigDefaults permet de construire une config avec des valeurs par défaut (T0038)
type ConfigDefaults struct {
	appPort         *int
	appEnv          *string
	jwtSecret       *string
	databaseURL     *string
	redisURL        *string
	corsOrigins     []string
	rateLimitLimit  *int
	rateLimitWindow *int
	logLevel        *string
	logger          *zap.Logger
}

// NewConfigDefaults crée un nouveau builder de defaults (T0038)
func NewConfigDefaults() *ConfigDefaults {
	return &ConfigDefaults{}
}

// WithPort définit le port par défaut (T0038)
func (b *ConfigDefaults) WithPort(port int) *ConfigDefaults {
	b.appPort = &port
	return b
}

// WithEnv définit l'environnement par défaut (T0038)
func (b *ConfigDefaults) WithEnv(env string) *ConfigDefaults {
	b.appEnv = &env
	return b
}

// WithJWTSecret définit le secret JWT par défaut (T0038)
func (b *ConfigDefaults) WithJWTSecret(secret string) *ConfigDefaults {
	b.jwtSecret = &secret
	return b
}

// WithDatabaseURL définit l'URL de la base de données par défaut (T0038)
func (b *ConfigDefaults) WithDatabaseURL(url string) *ConfigDefaults {
	b.databaseURL = &url
	return b
}

// WithRedisURL définit l'URL Redis par défaut (T0038)
func (b *ConfigDefaults) WithRedisURL(url string) *ConfigDefaults {
	b.redisURL = &url
	return b
}

// WithCORSOrigins définit les origines CORS par défaut (T0038)
func (b *ConfigDefaults) WithCORSOrigins(origins []string) *ConfigDefaults {
	b.corsOrigins = origins
	return b
}

// WithRateLimit définit les limites de rate limiting par défaut (T0038)
func (b *ConfigDefaults) WithRateLimit(limit int, windowSeconds int) *ConfigDefaults {
	b.rateLimitLimit = &limit
	b.rateLimitWindow = &windowSeconds
	return b
}

// WithLogLevel définit le niveau de log par défaut (T0038)
func (b *ConfigDefaults) WithLogLevel(level string) *ConfigDefaults {
	b.logLevel = &level
	return b
}

// WithLogger définit le logger par défaut (T0038)
func (b *ConfigDefaults) WithLogger(logger *zap.Logger) *ConfigDefaults {
	b.logger = logger
	return b
}

// Build construit une Config avec les valeurs par défaut (T0038)
func (b *ConfigDefaults) Build() *Config {
	config := &Config{}

	if b.appPort != nil {
		config.AppPort = *b.appPort
	}
	// Note: appEnv n'est pas dans Config, mais peut être utilisé ailleurs
	if b.jwtSecret != nil {
		config.JWTSecret = *b.jwtSecret
	}
	if b.databaseURL != nil {
		config.DatabaseURL = *b.databaseURL
	}
	if b.redisURL != nil {
		config.RedisURL = *b.redisURL
	}
	if len(b.corsOrigins) > 0 {
		config.CORSOrigins = b.corsOrigins
	}
	if b.rateLimitLimit != nil {
		config.RateLimitLimit = *b.rateLimitLimit
	}
	if b.rateLimitWindow != nil {
		config.RateLimitWindow = *b.rateLimitWindow
	}
	if b.logLevel != nil {
		config.LogLevel = *b.logLevel
	}
	if b.logger != nil {
		config.Logger = b.logger
	}

	return config
}

// Merge fusionne les valeurs par défaut avec une config existante (override) (T0038)
func (b *ConfigDefaults) Merge(config *Config) *Config {
	if b.appPort != nil {
		config.AppPort = *b.appPort
	}
	if b.jwtSecret != nil {
		config.JWTSecret = *b.jwtSecret
	}
	if b.databaseURL != nil {
		config.DatabaseURL = *b.databaseURL
	}
	if b.redisURL != nil {
		config.RedisURL = *b.redisURL
	}
	if len(b.corsOrigins) > 0 {
		config.CORSOrigins = b.corsOrigins
	}
	if b.rateLimitLimit != nil {
		config.RateLimitLimit = *b.rateLimitLimit
	}
	if b.rateLimitWindow != nil {
		config.RateLimitWindow = *b.rateLimitWindow
	}
	if b.logLevel != nil {
		config.LogLevel = *b.logLevel
	}
	if b.logger != nil {
		config.Logger = b.logger
	}

	return config
}
