package config

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

func TestDiscoverFiles_ConfigFileOverride(t *testing.T) {
	tmpDir := t.TempDir()
	homeDir := filepath.Join(tmpDir, "home")
	if err := os.MkdirAll(homeDir, 0o755); err != nil {
		t.Fatalf("creating temp HOME: %v", err)
	}

	t.Setenv("HOME", homeDir)
	t.Setenv("KELD_CONFIG_FILE", "~/only.toml")
	t.Setenv("KELD_CONFIG_PATHS", filepath.Join(tmpDir, "extras", "*.toml"))

	got := DiscoverFiles()
	want := []string{filepath.Join(homeDir, "only.toml")}

	if !reflect.DeepEqual(got, want) {
		t.Fatalf("DiscoverFiles() mismatch: got %#v, want %#v", got, want)
	}
}

func TestDiscoverFiles_Order(t *testing.T) {
	tmpDir := t.TempDir()
	dirA := filepath.Join(tmpDir, "a")
	dirB := filepath.Join(tmpDir, "b")
	extraDir := filepath.Join(tmpDir, "extra")
	if err := os.MkdirAll(filepath.Join(dirA, "conf.d"), 0o755); err != nil {
		t.Fatalf("mkdir dirA conf.d: %v", err)
	}
	if err := os.MkdirAll(filepath.Join(dirB, "conf.d"), 0o755); err != nil {
		t.Fatalf("mkdir dirB conf.d: %v", err)
	}
	if err := os.MkdirAll(extraDir, 0o755); err != nil {
		t.Fatalf("mkdir extraDir: %v", err)
	}

	for _, path := range []string{
		filepath.Join(dirA, "conf.d", "z.toml"),
		filepath.Join(dirA, "conf.d", "a.toml"),
		filepath.Join(dirB, "conf.d", "c.toml"),
		filepath.Join(dirB, "conf.d", "b.toml"),
		filepath.Join(extraDir, "later.toml"),
		filepath.Join(extraDir, "earlier.toml"),
	} {
		if err := os.WriteFile(path, []byte("# fixture"), 0o600); err != nil {
			t.Fatalf("writing %s: %v", path, err)
		}
	}

	explicit := filepath.Join(tmpDir, "explicit.toml")
	if err := os.WriteFile(explicit, []byte("# explicit"), 0o600); err != nil {
		t.Fatalf("writing explicit file: %v", err)
	}

	originalDirs := DefaultConfigDirs
	DefaultConfigDirs = []string{dirA, dirB}
	t.Cleanup(func() {
		DefaultConfigDirs = originalDirs
	})

	t.Setenv("KELD_CONFIG_FILE", "")
	t.Setenv("KELD_CONFIG_PATHS", filepath.Join(extraDir, "*.toml")+":"+explicit)

	got := DiscoverFiles()
	want := []string{
		filepath.Join(dirA, "config.toml"),
		filepath.Join(dirA, "conf.d", "a.toml"),
		filepath.Join(dirA, "conf.d", "z.toml"),
		filepath.Join(dirB, "config.toml"),
		filepath.Join(dirB, "conf.d", "b.toml"),
		filepath.Join(dirB, "conf.d", "c.toml"),
		filepath.Join(extraDir, "earlier.toml"),
		filepath.Join(extraDir, "later.toml"),
		explicit,
	}

	if !reflect.DeepEqual(got, want) {
		t.Fatalf("DiscoverFiles() ordering mismatch: got %#v, want %#v", got, want)
	}
}
