package config

import (
	"os"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestLoadEnvFiles(t *testing.T) {
	tests := []struct {
		name    string
		env     string
		wantErr bool
	}{
		{
			name:    "development environment",
			env:     "development",
			wantErr: false,
		},
		{
			name:    "production environment",
			env:     "production",
			wantErr: false,
		},
		{
			name:    "test environment",
			env:     "test",
			wantErr: false,
		},
		{
			name:    "environment without file (should not error)",
			env:     "staging",
			wantErr: false,
		},
		{
			name:    "custom environment",
			env:     "custom",
			wantErr: false,
		},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			// Sauvegarder la valeur originale de TEST_VAR si elle existe
			originalValue := os.Getenv("TEST_VAR")
			defer func() {
				if originalValue != "" {
					os.Setenv("TEST_VAR", originalValue)
				} else {
					os.Unsetenv("TEST_VAR")
				}
			}()

			// Unset TEST_VAR avant le test pour éviter les valeurs système
			os.Unsetenv("TEST_VAR")

			// Test: LoadEnvFiles ne devrait pas causer d'erreur même si les fichiers n'existent pas
			err := LoadEnvFiles(tt.env)
			if tt.wantErr {
				require.Error(t, err)
			} else {
				// Si le fichier n'existe pas, ce n'est pas une erreur
				require.NoError(t, err)
			}
		})
	}
}

func TestLoadEnvFiles_Priority(t *testing.T) {
	// Tester que les variables d'environnement système ont priorité sur les fichiers .env
	// Sauvegarder la valeur originale
	originalValue := os.Getenv("TEST_PRIORITY")
	defer func() {
		if originalValue != "" {
			os.Setenv("TEST_PRIORITY", originalValue)
		} else {
			os.Unsetenv("TEST_PRIORITY")
		}
	}()

	// Définir variable système avant de charger les fichiers
	os.Setenv("TEST_PRIORITY", "system_value")

	// Charger les fichiers (même si .env.development n'existe pas, ça ne devrait pas causer d'erreur)
	err := LoadEnvFiles("development")
	require.NoError(t, err)

	// La variable système doit toujours être présente (godotenv ne surcharge pas les variables existantes)
	value := os.Getenv("TEST_PRIORITY")
	assert.Equal(t, "system_value", value, "System environment variable should have priority")
}

func TestLoadEnvFiles_NoErrorOnMissingFile(t *testing.T) {
	// Tester que LoadEnvFiles ne cause pas d'erreur si les fichiers n'existent pas
	err := LoadEnvFiles("nonexistent_env_12345")
	// Ne devrait pas causer d'erreur si les fichiers n'existent pas
	assert.NoError(t, err)
}

func TestLoadEnvFiles_EmptyEnvironment(t *testing.T) {
	// Tester avec un environnement vide
	err := LoadEnvFiles("")
	// Ne devrait pas causer d'erreur
	assert.NoError(t, err)
}
