package infra

import (
	"testing"
)

func TestEnvRequire(t *testing.T) {
	t.Run("retorna valor cuando variable esta seteada", func(t *testing.T) {
		t.Setenv("ENV_REQUIRE_TEST_KEY", "myvalue")
		got, err := EnvRequire("ENV_REQUIRE_TEST_KEY")
		if err != nil {
			t.Fatalf("unexpected error: %v", err)
		}
		if got != "myvalue" {
			t.Errorf("expected myvalue, got %q", got)
		}
	})

	t.Run("retorna error con mensaje descriptivo si variable no existe", func(t *testing.T) {
		got, err := EnvRequire("ENV_REQUIRE_DEFINITELY_NOT_SET_XYZ")
		if err == nil {
			t.Error("expected error for missing variable")
		}
		if got != "" {
			t.Errorf("expected empty string on error, got %q", got)
		}
		if err != nil && len(err.Error()) == 0 {
			t.Error("error message should not be empty")
		}
	})

	t.Run("variable vacia se trata como no seteada", func(t *testing.T) {
		t.Setenv("ENV_REQUIRE_EMPTY_KEY", "")
		_, err := EnvRequire("ENV_REQUIRE_EMPTY_KEY")
		if err == nil {
			t.Error("expected error for empty variable")
		}
	})
}

func TestEnvRequireAll(t *testing.T) {
	t.Run("retorna mapa con todos los valores cuando estan seteados", func(t *testing.T) {
		t.Setenv("REQUIRE_ALL_A", "alpha")
		t.Setenv("REQUIRE_ALL_B", "beta")
		got, err := EnvRequireAll([]string{"REQUIRE_ALL_A", "REQUIRE_ALL_B"})
		if err != nil {
			t.Fatalf("unexpected error: %v", err)
		}
		if got["REQUIRE_ALL_A"] != "alpha" || got["REQUIRE_ALL_B"] != "beta" {
			t.Errorf("unexpected map: %v", got)
		}
	})

	t.Run("acumula todos los errores de variables faltantes", func(t *testing.T) {
		_, err := EnvRequireAll([]string{"REQUIRE_ALL_MISSING_1", "REQUIRE_ALL_MISSING_2"})
		if err == nil {
			t.Error("expected error")
		}
		msg := err.Error()
		if len(msg) == 0 {
			t.Error("expected non-empty error message")
		}
	})

	t.Run("lista vacia retorna mapa vacio sin error", func(t *testing.T) {
		got, err := EnvRequireAll([]string{})
		if err != nil {
			t.Fatalf("unexpected error: %v", err)
		}
		if len(got) != 0 {
			t.Errorf("expected empty map, got %v", got)
		}
	})
}
