package config

import (
	"log"
	"os"
)

// Config 持有 push-gateway 运行时配置
type Config struct {
	Port           string
	JWTSecret      string
	DevMode        bool
	RedisURL       string
	OTLPEndpoint   string
	InternalAPIKey string
}

// devJWTSecret 是 DevMode 下的默认 JWT 密钥（仅用于本地联调，生产必须配置 JWT_SECRET）
const devJWTSecret = "p1-dev-secret-change-in-production"

// Load 从环境变量加载配置。
// 非 DevMode 下若 JWT_SECRET 未配置则 fatal 退出；DevMode 下使用默认密钥并打印 warning。
func Load() *Config {
	devMode := getEnv("DEV_MODE", "false") == "true"
	jwtSecret := getEnv("JWT_SECRET", "")
	if jwtSecret == "" {
		if devMode {
			log.Println("warning: JWT_SECRET not set, using dev default (DEV_MODE=true)")
			jwtSecret = devJWTSecret
		} else {
			log.Fatal("JWT_SECRET must be set in non-dev mode")
		}
	}

	return &Config{
		Port:           getEnv("PUSH_GATEWAY_PORT", "8081"),
		JWTSecret:      jwtSecret,
		DevMode:        devMode,
		RedisURL:       getEnv("REDIS_URL", ""),
		OTLPEndpoint:   getEnv("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4318"),
		InternalAPIKey: getEnv("INTERNAL_API_KEY", ""),
	}
}

// getEnv 读取环境变量，缺失时返回 fallback
func getEnv(key, fallback string) string {
	if v := os.Getenv(key); v != "" {
		return v
	}
	return fallback
}
