package config

import (
	"fmt"
	"os"
	"strconv"
)

// ServiceConfig holds configuration shared across all microservices.
type ServiceConfig struct {
	Name string // 服务名称，如 auth-service
	Port string // 监听端口

	// 基础设施连接（骨架阶段仅定义，暂不使用）
	PostgresDSN string
	RedisAddr   string
	MinIOAddr   string
	RabbitMQURL string

	// 运行环境: debug / release
	GinMode string
}

// Load 从环境变量加载配置，fallback 到默认值。
// serviceName 和 defaultPort 用于在没有设置环境变量时提供默认值。
func Load(serviceName, defaultPort string) *ServiceConfig {
	cfg := &ServiceConfig{
		Name:        serviceName,
		Port:        envOr("SERVICE_PORT", defaultPort),
		PostgresDSN: envOr("POSTGRES_DSN", "postgres://mrcc:mrcc_dev_2026@localhost:5432/mrcc?sslmode=disable"),
		RedisAddr:   envOr("REDIS_ADDR", "localhost:6379"),
		MinIOAddr:   envOr("MINIO_ADDR", "localhost:9000"),
		RabbitMQURL: envOr("RABBITMQ_URL", "amqp://mrcc:mrcc_dev_2026@localhost:5672/"),
		GinMode:     envOr("GIN_MODE", "debug"),
	}
	return cfg
}

// Address 返回 :port 格式的监听地址
func (c *ServiceConfig) Address() string {
	return fmt.Sprintf(":%s", c.Port)
}

func envOr(key, fallback string) string {
	if v := os.Getenv(key); v != "" {
		return v
	}
	return fallback
}

func envIntOr(key string, fallback int) int {
	if v := os.Getenv(key); v != "" {
		if n, err := strconv.Atoi(v); err == nil {
			return n
		}
	}
	return fallback
}
