package config

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

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

func TestDefaultPathInDir(t *testing.T) {
	t.Run("prefers config.yaml when both exist", func(t *testing.T) {
		dir := t.TempDir()
		want := filepath.Join(dir, "config.yaml")
		other := filepath.Join(dir, "config.yml")
		require.NoError(t, os.WriteFile(want, []byte("a: 1"), 0644))
		require.NoError(t, os.WriteFile(other, []byte("a: 2"), 0644))

		got, err := defaultPathInDir(dir)
		require.NoError(t, err)
		assert.Equal(t, want, got)
	})

	t.Run("returns config.yaml when only it exists", func(t *testing.T) {
		dir := t.TempDir()
		want := filepath.Join(dir, "config.yaml")
		require.NoError(t, os.WriteFile(want, []byte("a: 1"), 0644))

		got, err := defaultPathInDir(dir)
		require.NoError(t, err)
		assert.Equal(t, want, got)
	})

	t.Run("falls back to config.yml when only it exists", func(t *testing.T) {
		dir := t.TempDir()
		want := filepath.Join(dir, "config.yml")
		require.NoError(t, os.WriteFile(want, []byte("a: 1"), 0644))

		got, err := defaultPathInDir(dir)
		require.NoError(t, err)
		assert.Equal(t, want, got)
	})

	t.Run("errors when neither exists and names both paths", func(t *testing.T) {
		dir := t.TempDir()
		got, err := defaultPathInDir(dir)
		assert.Empty(t, got)
		require.Error(t, err)
		assert.Contains(t, err.Error(), filepath.Join(dir, "config.yaml"))
		assert.Contains(t, err.Error(), filepath.Join(dir, "config.yml"))
	})
}

func TestDefaultPath(t *testing.T) {
	got, err := DefaultPath()
	if err != nil {
		ex, exErr := os.Executable()
		require.NoError(t, exErr)
		assert.Contains(t, err.Error(), filepath.Dir(ex))
		return
	}
	ex, err := os.Executable()
	require.NoError(t, err)
	assert.Equal(t, filepath.Dir(ex), filepath.Dir(got))
	assert.Contains(t, []string{"config.yaml", "config.yml"}, filepath.Base(got))
}
