// package main
//
// import (
//
//	"fmt"
//	"os"
//
//	"github.com/spf13/viper"
//
// )
//
//	func main() {
//		// 方案：先设置环境变量，再设置前缀和绑定
//		// 1. 先设置环境变量（模拟）
//		os.Setenv("MYAPP_PORT", "9000")
//		os.Setenv("MYAPP_DEBUG", "true")
//		os.Setenv("MYAPP_DB_HOST", "192.168.1.100")
//
//		// 2. 设置环境变量前缀
//		viper.SetEnvPrefix("MYAPP")
//
//		// 3. 设置默认值
//		viper.SetDefault("port", 8080)
//		viper.SetDefault("debug", false)
//		viper.SetDefault("db.host", "localhost")
//
//		// 4. 绑定环境变量 - 显式指定完整的环境变量名（不加前缀）
//		viper.BindEnv("port", "MYAPP_PORT")
//		viper.BindEnv("debug", "MYAPP_DEBUG")
//		viper.BindEnv("db.host", "MYAPP_DB_HOST") // 直接指定完整的环境变量名
//
//		// 5. 读取配置
//		port := viper.GetInt("port")
//		debug := viper.GetBool("debug")
//		dbHost := viper.GetString("db.host")
//
//		fmt.Printf("Port: %d (from env)\n", port)
//		fmt.Printf("Debug: %v (from env)\n", debug)
//		fmt.Printf("DB Host: %s (from env)\n", dbHost)
//
//		// 6. 启用自动环境变量绑定
//		viper.AutomaticEnv()
//
//		// 设置自定义环境变量后获取
//		os.Setenv("MYAPP_CUSTOM_KEY", "custom_value")
//		// 注意：AutomaticEnv 后，MYAPP_CUSTOM_KEY 会映射到 custom_key
//		customKey := viper.GetString("custom_key")
//		fmt.Printf("Custom Key: %s\n", customKey)
//
//		// 验证环境变量是否真的设置成功
//		fmt.Println("\n=== 验证环境变量 ===")
//		fmt.Printf("MYAPP_PORT: %s\n", os.Getenv("MYAPP_PORT"))
//		fmt.Printf("MYAPP_DEBUG: %s\n", os.Getenv("MYAPP_DEBUG"))
//		fmt.Printf("MYAPP_DB_HOST: %s\n", os.Getenv("MYAPP_DB_HOST"))
//	}
package main

import (
	"fmt"
	"os"
	"strings"

	"github.com/spf13/viper"
)

func main() {
	// 1. 设置环境变量前缀
	viper.SetEnvPrefix("MYAPP") // 自动添加前缀
	viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))

	// 2. 绑定环境变量
	viper.BindEnv("port")    // 绑定 MYAPP_PORT
	viper.BindEnv("debug")   // 绑定 MYAPP_DEBUG
	viper.BindEnv("db.host") // 绑定 MYAPP_DB_HOST

	// 3. 设置默认值
	viper.SetDefault("port", 8080)
	viper.SetDefault("debug", false)

	// 4. 设置环境变量（模拟）
	os.Setenv("MYAPP_PORT", "9000")
	os.Setenv("MYAPP_DEBUG", "true")
	os.Setenv("MYAPP_DB_HOST", "192.168.1.100")

	// 5. 读取配置（优先级：环境变量 > 配置文件 > 默认值）
	port := viper.GetInt("port")
	debug := viper.GetBool("debug")
	dbHost := viper.GetString("db.host")

	fmt.Printf("Port: %d (from env)\n", port)
	fmt.Printf("Debug: %v (from env)\n", debug)
	fmt.Printf("DB Host: %s (from env)\n", dbHost)

	// 6. 自动绑定所有环境变量
	viper.AutomaticEnv()

	os.Setenv("MYAPP_CUSTOM_KEY", "custom_value")
	customKey := viper.GetString("custom.key") // 自动转换 CUSTOM_KEY -> custom.key
	fmt.Printf("Custom Key: %s\n", customKey)
}
