// Package config charge la configuration de l'application depuis les variables d'environnement.
package config

import (
	"fmt"
	"os"
	"time"
)

// Config regroupe tous les paramètres de configuration du serveur.
type Config struct {
	DatabaseURL   string        // chaîne de connexion PostgreSQL
	JWTSecret     []byte        // secret de signature des JWT
	JWTAccessTTL  time.Duration // durée de vie des access tokens
	JWTRefreshTTL time.Duration // durée de vie des refresh tokens
	StoragePath   string        // dossier de stockage des PDF sur disque
	Port          string        // port d'écoute HTTP
	CORSOrigin    string        // origine autorisée pour le CORS
}

// Load lit la configuration depuis l'environnement et applique les valeurs par défaut.
// Retourne une erreur si une variable obligatoire est absente ou invalide.
func Load() (*Config, error) {
	cfg := &Config{
		DatabaseURL: os.Getenv("DATABASE_URL"),
		StoragePath: getEnv("STORAGE_PATH", "/data/documents"),
		Port:        getEnv("PORT", "8080"),
		CORSOrigin:  os.Getenv("CORS_ORIGIN"),
	}

	if cfg.DatabaseURL == "" {
		return nil, fmt.Errorf("la variable d'environnement DATABASE_URL est obligatoire")
	}

	secret := os.Getenv("JWT_SECRET")
	if secret == "" {
		return nil, fmt.Errorf("la variable d'environnement JWT_SECRET est obligatoire")
	}
	cfg.JWTSecret = []byte(secret)

	accessTTL, err := time.ParseDuration(getEnv("JWT_ACCESS_TTL", "15m"))
	if err != nil {
		return nil, fmt.Errorf("JWT_ACCESS_TTL invalide : %w", err)
	}
	cfg.JWTAccessTTL = accessTTL

	refreshTTL, err := time.ParseDuration(getEnv("JWT_REFRESH_TTL", "168h"))
	if err != nil {
		return nil, fmt.Errorf("JWT_REFRESH_TTL invalide : %w", err)
	}
	cfg.JWTRefreshTTL = refreshTTL

	return cfg, nil
}

// getEnv retourne la valeur de la variable d'environnement clef, ou def si absente.
func getEnv(key, def string) string {
	if v := os.Getenv(key); v != "" {
		return v
	}
	return def
}
