package config

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

// services.json 안의 ${ENV_VAR}가 환경변수 값으로 치환되어야 한다.
func TestLoadExpandsEnvVars(t *testing.T) {
	dir := t.TempDir()
	path := filepath.Join(dir, "services.json")
	content := `[{"type":"postgres","name":"db","dsn":"postgres://mon:${TEST_DB_PASS}@localhost:5432/app","password":"${TEST_REDIS_PASS}"}]`
	if err := os.WriteFile(path, []byte(content), 0o600); err != nil {
		t.Fatal(err)
	}
	t.Setenv("TEST_DB_PASS", "s3cret!")
	t.Setenv("TEST_REDIS_PASS", "r3dis")

	list, err := Load(path)
	if err != nil {
		t.Fatalf("Load 실패: %v", err)
	}
	if len(list) != 1 {
		t.Fatalf("서비스 1개 기대, %d개", len(list))
	}
	if got, want := list[0].DSN, "postgres://mon:s3cret!@localhost:5432/app"; got != want {
		t.Errorf("DSN 치환 실패: got %q, want %q", got, want)
	}
	if got, want := list[0].Password, "r3dis"; got != want {
		t.Errorf("Password 치환 실패: got %q, want %q", got, want)
	}
}

// 정의되지 않은 환경변수는 원문 ${VAR}를 그대로 남겨 설정 오류를 눈에 띄게 한다.
func TestLoadKeepsUndefinedVarLiteral(t *testing.T) {
	dir := t.TempDir()
	path := filepath.Join(dir, "services.json")
	content := `[{"type":"redis","name":"cache","addr":"localhost:6379","password":"${UNDEFINED_VAR_XYZ}"}]`
	if err := os.WriteFile(path, []byte(content), 0o600); err != nil {
		t.Fatal(err)
	}

	list, err := Load(path)
	if err != nil {
		t.Fatalf("Load 실패: %v", err)
	}
	if got, want := list[0].Password, "${UNDEFINED_VAR_XYZ}"; got != want {
		t.Errorf("미정의 변수는 원문 유지 기대: got %q, want %q", got, want)
	}
}
