// SPDX-License-Identifier: Apache-2.0
// Copyright Authors of K9s

package config

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

	"github.com/adrg/xdg"
	"github.com/derailed/k9s/internal/config/data"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func Test_initXDGLocs(t *testing.T) {
	tmp, err := UserTmpDir()
	require.NoError(t, err)

	require.NoError(t, os.Unsetenv("XDG_CONFIG_HOME"))
	require.NoError(t, os.Unsetenv("XDG_CACHE_HOME"))
	require.NoError(t, os.Unsetenv("XDG_STATE_HOME"))
	require.NoError(t, os.Unsetenv("XDG_DATA_HOME"))

	require.NoError(t, os.Setenv("XDG_CONFIG_HOME", filepath.Join(tmp, "k9s-xdg", "config")))
	require.NoError(t, os.Setenv("XDG_CACHE_HOME", filepath.Join(tmp, "k9s-xdg", "cache")))
	require.NoError(t, os.Setenv("XDG_STATE_HOME", filepath.Join(tmp, "k9s-xdg", "state")))
	require.NoError(t, os.Setenv("XDG_DATA_HOME", filepath.Join(tmp, "k9s-xdg", "data")))
	xdg.Reload()

	uu := map[string]struct {
		configDir          string
		configFile         string
		benchmarksDir      string
		contextsDir        string
		contextHotkeysFile string
		contextConfig      string
		dumpsDir           string
		benchDir           string
		hkFile             string
	}{
		"check-env": {
			configDir:          filepath.Join(tmp, "k9s-xdg", "config", "k9s"),
			configFile:         filepath.Join(tmp, "k9s-xdg", "config", "k9s", data.MainConfigFile),
			benchmarksDir:      filepath.Join(tmp, "k9s-xdg", "state", "k9s", "benchmarks"),
			contextsDir:        filepath.Join(tmp, "k9s-xdg", "data", "k9s", "clusters"),
			contextHotkeysFile: filepath.Join(tmp, "k9s-xdg", "data", "k9s", "clusters", "cl-1", "ct-1-1", "hotkeys.yaml"),
			contextConfig:      filepath.Join(tmp, "k9s-xdg", "data", "k9s", "clusters", "cl-1", "ct-1-1", data.MainConfigFile),
			dumpsDir:           filepath.Join(tmp, "k9s-xdg", "state", "k9s", "screen-dumps", "cl-1", "ct-1-1"),
			benchDir:           filepath.Join(tmp, "k9s-xdg", "state", "k9s", "benchmarks", "cl-1", "ct-1-1"),
			hkFile:             filepath.Join(tmp, "k9s-xdg", "config", "k9s", "hotkeys.yaml"),
		},
	}

	for k := range uu {
		u := uu[k]
		t.Run(k, func(t *testing.T) {
			require.NoError(t, initXDGLocs())
			assert.Equal(t, u.configDir, AppConfigDir)
			assert.Equal(t, u.configFile, AppConfigFile)
			assert.Equal(t, u.benchmarksDir, AppBenchmarksDir)
			assert.Equal(t, u.contextsDir, AppContextsDir)
			assert.Equal(t, u.contextHotkeysFile, AppContextHotkeysFile("cl-1", "ct-1-1"))
			assert.Equal(t, u.contextConfig, AppContextConfig("cl-1", "ct-1-1"))
			dir, err := DumpsDir("cl-1", "ct-1-1")
			require.NoError(t, err)
			assert.Equal(t, u.dumpsDir, dir)
			bdir, err := EnsureBenchmarksDir("cl-1", "ct-1-1")
			require.NoError(t, err)
			assert.Equal(t, u.benchDir, bdir)
			hk, err := EnsureHotkeysCfgFile()
			require.NoError(t, err)
			assert.Equal(t, u.hkFile, hk)
		})
	}
}
