package core

import (
	"os"
	"testing"
)

func TestTestEnvSet(t *testing.T) {
	t.Run("variable nueva se setea y se restaura al finalizar", func(t *testing.T) {
		const key = "TEST_ENV_SET_NEW_VAR_XYZ"
		os.Unsetenv(key) // asegurarse de que no existe

		TestEnvSet(t, map[string]string{key: "hello"})

		if got := os.Getenv(key); got != "hello" {
			t.Errorf("got %q, want \"hello\"", got)
		}

		// Simular que el test termino llamando al restore
		// (en tests reales t.Cleanup lo hace automaticamente)
	})

	t.Run("variable existente se sobreescribe y se restaura al finalizar", func(t *testing.T) {
		const key = "TEST_ENV_SET_EXISTING_VAR_XYZ"
		os.Setenv(key, "original")

		restore := TestEnvSet(t, map[string]string{key: "overridden"})

		if got := os.Getenv(key); got != "overridden" {
			t.Errorf("got %q, want \"overridden\"", got)
		}

		restore()

		if got := os.Getenv(key); got != "original" {
			t.Errorf("after restore got %q, want \"original\"", got)
		}
		os.Unsetenv(key)
	})

	t.Run("multiples variables se setean y restauran correctamente", func(t *testing.T) {
		os.Unsetenv("TEST_MULTI_A")
		os.Unsetenv("TEST_MULTI_B")

		restore := TestEnvSet(t, map[string]string{
			"TEST_MULTI_A": "value-a",
			"TEST_MULTI_B": "value-b",
		})

		if got := os.Getenv("TEST_MULTI_A"); got != "value-a" {
			t.Errorf("A: got %q, want \"value-a\"", got)
		}
		if got := os.Getenv("TEST_MULTI_B"); got != "value-b" {
			t.Errorf("B: got %q, want \"value-b\"", got)
		}

		restore()

		if got, ok := os.LookupEnv("TEST_MULTI_A"); ok {
			t.Errorf("A should be unset after restore, got %q", got)
		}
		if got, ok := os.LookupEnv("TEST_MULTI_B"); ok {
			t.Errorf("B should be unset after restore, got %q", got)
		}
	})

	t.Run("restore manual funciona antes del cleanup automatico", func(t *testing.T) {
		const key = "TEST_ENV_MANUAL_RESTORE"
		os.Setenv(key, "before")

		restore := TestEnvSet(t, map[string]string{key: "during"})

		if got := os.Getenv(key); got != "during" {
			t.Errorf("got %q, want \"during\"", got)
		}

		restore() // restaura manualmente

		if got := os.Getenv(key); got != "before" {
			t.Errorf("after manual restore got %q, want \"before\"", got)
		}
		os.Unsetenv(key)
	})
}
