package configx

import (
	"os"
	"path/filepath"
	"testing"
)

func TestLoadYAMLExpandsBraceEnvOnly(t *testing.T) {
	t.Setenv("CONFIGX_TEST_SECRET", "secret-value")
	path := filepath.Join(t.TempDir(), "config.yaml")
	if err := os.WriteFile(path, []byte("secret: \"${CONFIGX_TEST_SECRET}\"\nliteral: \"price$100\"\nmissing: \"${CONFIGX_TEST_MISSING}\"\n"), 0o600); err != nil {
		t.Fatalf("write config failed: %v", err)
	}
	var cfg struct {
		Secret  string `yaml:"secret"`
		Literal string `yaml:"literal"`
		Missing string `yaml:"missing"`
	}
	if err := LoadYAMLWithEnv(path, &cfg); err != nil {
		t.Fatalf("LoadYAMLWithEnv failed: %v", err)
	}
	if cfg.Secret != "secret-value" || cfg.Literal != "price$100" || cfg.Missing != "" {
		t.Fatalf("env expansion mismatch: %+v", cfg)
	}
}

func TestLoadDotEnvFileDoesNotOverrideRuntimeEnv(t *testing.T) {
	t.Setenv("CONFIGX_DOTENV_EXISTING", "runtime")
	t.Cleanup(func() {
		_ = os.Unsetenv("CONFIGX_DOTENV_NEW")
		_ = os.Unsetenv("CONFIGX_DOTENV_EXPORTED")
	})
	path := filepath.Join(t.TempDir(), ".env")
	content := []byte("CONFIGX_DOTENV_EXISTING=file\nCONFIGX_DOTENV_NEW=\"file-value\"\n# comment\nexport CONFIGX_DOTENV_EXPORTED='exported-value'\n")
	if err := os.WriteFile(path, content, 0o600); err != nil {
		t.Fatalf("write .env failed: %v", err)
	}
	if err := LoadDotEnvFile(path); err != nil {
		t.Fatalf("LoadDotEnvFile failed: %v", err)
	}
	if os.Getenv("CONFIGX_DOTENV_EXISTING") != "runtime" {
		t.Fatalf(".env must not override runtime env")
	}
	if os.Getenv("CONFIGX_DOTENV_NEW") != "file-value" || os.Getenv("CONFIGX_DOTENV_EXPORTED") != "exported-value" {
		t.Fatalf(".env variables were not loaded")
	}
}
