package configs

import (
	"os"
	"strconv"
	"strings"

	"github.com/joho/godotenv"
	"go.uber.org/zap"
)

type Config struct {
	Env                      string // örn. development, production
	Port                     string
	DBUrl                    string
	DBPGUrl                    string
	JWTSecret                string
	AppURL                   string // örn. https://api.example.com - e-posta doğrulama linkleri için kullanılır
	GoogleClientID           string
	GoogleClientSecret       string
	GithubClientID           string
	GithubClientSecret       string
	GoogleRedirectURL        string
	GithubRedirectURL        string
	ClientCallbackURL        string
	OAuthRedirectURL         string
	RedisUrl                 string
	AccessTokenExpireMinutes int
	RefreshTokenExpireDays   int
	// E-posta Ayarları
	EmailHost         string
	EmailPort         string
	EmailHostUser     string
	EmailHostPassword string
	EmailFrom         string
	CorsDebug         bool
}

var AppConfig *Config

func LoadConfig() {
	err := godotenv.Load()
	if err != nil {
		// Eğer proje kök dizininden çalıştırılmıyorsa (örn: cmd/app içinden), üst dizinleri kontrol et
		err = godotenv.Load(".env")
		//err = godotenv.Load("../../.env")
	}
	if err != nil {
		// Logger henüz hazır olmayabilir; varsa kullan
		if Logger != nil {
			Logger.Warn("Uyarı: .env dosyası yüklenirken hata oluştu, sistem ortam değişkenleriyle devam ediliyor", zapFieldsForEnvError(err)...)
		}
	}

	AppConfig = &Config{
		Env:                      getEnv("APP_ENV", "development"),
		Port:                     getEnv("PORT", "8080"),
		DBUrl:                    getEnv("DB_URL", ""),
		DBPGUrl:                  getEnv("DB_URL_PG", ""),
		JWTSecret:                getEnv("JWT_SECRET", "default_secret"),
		AppURL:                   getEnv("APP_URL", "http://localhost:8080"),
		GoogleClientID:           getEnv("GOOGLE_CLIENT_ID", ""),
		GoogleClientSecret:       getEnv("GOOGLE_CLIENT_SECRET", ""),
		GithubClientID:           getEnv("GITHUB_CLIENT_ID", ""),
		GithubClientSecret:       getEnv("GITHUB_CLIENT_SECRET", ""),
		GoogleRedirectURL:        getEnv("GOOGLE_REDIRECT_URL", "http://localhost:8080/api/v1/auth/google/callback"),
		GithubRedirectURL:        getEnv("GITHUB_REDIRECT_URL", "http://localhost:8080/api/v1/auth/github/callback"),
		ClientCallbackURL:        getEnv("CLIENT_CALLBACK_URL", ""),
		OAuthRedirectURL:         getEnv("OAUTH_REDIRECT_URL", ""),
		RedisUrl:                 getEnv("REDIS_URL", ""),
		AccessTokenExpireMinutes: getEnvAsInt("ACCESS_TOKEN_EXPIRE_MINUTES", 120), // Varsayılan 120 dakika
		RefreshTokenExpireDays:   getEnvAsInt("REFRESH_TOKEN_EXPIRE_DAYS", 30),    // Varsayılan 30 gün

		// E-posta Varsayılanları
		EmailHost:         getEnv("EMAIL_HOST", "localhost"),
		EmailPort:         getEnv("EMAIL_PORT", "1025"),
		EmailHostUser:     getEnv("EMAIL_HOST_USER", ""),
		EmailHostPassword: getEnv("EMAIL_HOST_PASSWORD", ""),
		EmailFrom:         getEnv("EMAIL_FROM", "noreply@gauth.local"),
		CorsDebug:         getEnvAsBool("CORS_DEBUG", false),
	}
}

func getEnv(key, fallback string) string {
	if value, exists := os.LookupEnv(key); exists {
		return value
	}
	return fallback
}

func getEnvAsInt(key string, fallback int) int {
	valueStr := getEnv(key, "")
	if valueStr == "" {
		return fallback
	}
	value, err := strconv.Atoi(valueStr)
	if err != nil {
		return fallback
	}
	return value
}

func getEnvAsBool(key string, fallback bool) bool {
	valueStr := strings.TrimSpace(getEnv(key, ""))
	if valueStr == "" {
		return fallback
	}
	value, err := strconv.ParseBool(valueStr)
	if err != nil {
		return fallback
	}
	return value
}

func zapFieldsForEnvError(err error) []zap.Field {
	return []zap.Field{
		zap.String("error", err.Error()),
	}
}
