package config

import (
	"fmt"
	"os"
)

type Config struct {
	DatabaseURL   string
	JWTSecret     string
	JWTExpiry     int
	Port          string
	Host          string
	LogLevel      string
	LogFormat     string
	SMTPHost      string
	SMTPPort      string
	SMTPUsername  string
	SMTPPassword  string
	SMTPFromEmail string
	SMTPFromName  string
	RedisHost     string
	RedisPort     string
	RedisPassword string
	RedisDB       int
	RedisAddr     string
}

func Load() *Config {
	// Build database URL from individual components
	dbURL := buildDatabaseURL()

	redisHost := getEnv("REDIS_HOST", "localhost")
	redisPort := getEnv("REDIS_PORT", "6379")

	return &Config{
		DatabaseURL:   dbURL,
		JWTSecret:     getEnv("JWT_SECRET", "your_jwt_secret_key_here_make_it_long_and_secure"),
		JWTExpiry:     getEnvAsInt("JWT_EXPIRY_HOURS", 24),
		Port:          getEnv("SERVER_PORT", "8080"),
		Host:          getEnv("SERVER_HOST", "0.0.0.0"),
		LogLevel:      getEnv("LOG_LEVEL", "info"),
		LogFormat:     getEnv("LOG_FORMAT", "json"),
		SMTPHost:      getEnv("SMTP_HOST", "smtp.gmail.com"),
		SMTPPort:      getEnv("SMTP_PORT", "587"),
		SMTPUsername:  getEnv("SMTP_USERNAME", ""),
		SMTPPassword:  getEnv("SMTP_PASSWORD", ""),
		SMTPFromEmail: getEnv("SMTP_FROM_EMAIL", "noreply@netgoplus.com"),
		SMTPFromName:  getEnv("SMTP_FROM_NAME", "Netgoplus"),
		RedisHost:     redisHost,
		RedisPort:     redisPort,
		RedisPassword: getEnv("REDIS_PASSWORD", ""),
		RedisDB:       getEnvAsInt("REDIS_DB", 0),
		RedisAddr:     fmt.Sprintf("%s:%s", redisHost, redisPort),
	}
}

func buildDatabaseURL() string {
	// Check if DATABASE_URL is set directly
	if dbURL := os.Getenv("DATABASE_URL"); dbURL != "" {
		return dbURL
	}

	// Build from individual components
	host := getEnv("DB_HOST", "localhost")
	port := getEnv("DB_PORT", "5432")
	user := getEnv("DB_USER", "postgres")
	password := getEnv("DB_PASSWORD", "password123")
	dbName := getEnv("DB_NAME", "internet")
	sslMode := getEnv("DB_SSL_MODE", "disable")

	return fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=%s",
		user, password, host, port, dbName, sslMode)
}

func getEnv(key, defaultValue string) string {
	if value := os.Getenv(key); value != "" {
		return value
	}
	return defaultValue
}

func getEnvAsInt(key string, defaultValue int) int {
	if value := os.Getenv(key); value != "" {
		var result int
		if _, err := fmt.Sscanf(value, "%d", &result); err == nil {
			return result
		}
	}
	return defaultValue
}
