package fs

import (
	"fmt"
	"os"
	"os/user"
	"testing"

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

func TestMain(m *testing.M) {
	if insensitive, err := CaseInsensitive(os.TempDir()); err != nil {
		fmt.Println(err)
	} else if insensitive {
		IgnoreCase()
	}

	code := m.Run()

	os.Exit(code)
}

func TestFileExists(t *testing.T) {
	assert.True(t, FileExists("./testdata/test.jpg"))
	assert.True(t, FileExists("./testdata/test.jpg"))
	assert.True(t, FileExists("./testdata/empty.jpg"))
	assert.False(t, FileExists("./foo.jpg"))
	assert.False(t, FileExists(""))
}

func TestFileExistsNotEmpty(t *testing.T) {
	assert.True(t, FileExistsNotEmpty("./testdata/test.jpg"))
	assert.True(t, FileExistsNotEmpty("./testdata/test.jpg"))
	assert.False(t, FileExistsNotEmpty("./testdata/empty.jpg"))
	assert.False(t, FileExistsNotEmpty("./foo.jpg"))
	assert.False(t, FileExistsNotEmpty(""))
}

func TestPathExists(t *testing.T) {
	assert.True(t, PathExists("./testdata"))
	assert.False(t, PathExists("./testdata/test.jpg"))
	assert.False(t, PathExists("./testdata3ggdtgdg"))
}

func TestPathWritable(t *testing.T) {
	assert.True(t, PathExists("./testdata"))
	assert.False(t, PathExists("./testdata/test.jpg"))
	assert.False(t, PathExists("./testdata3ggdtgdg"))
}

func TestOverwrite(t *testing.T) {
	data := make([]byte, 3)
	data[1] = 3
	data[2] = 8
	tmpPath := "./testdata/_tmp"
	os.Mkdir(tmpPath, 0777)

	defer os.RemoveAll(tmpPath)
	result := Overwrite("./testdata/_tmp/notyetexisting.jpg", data)
	assert.FileExists(t, "./testdata/_tmp/notyetexisting.jpg")
	assert.True(t, result)
}

func TestExpandedFilename(t *testing.T) {
	t.Run("test.jpg", func(t *testing.T) {
		filename := Abs("./testdata/test.jpg")
		assert.Contains(t, filename, "/testdata/test.jpg")
		assert.IsType(t, "", filename)
	})
	t.Run("empty filename", func(t *testing.T) {
		filename := Abs("")
		assert.Equal(t, "", filename)
		assert.IsType(t, "", filename)
	})
	t.Run("~ in filename", func(t *testing.T) {
		usr, _ := user.Current()
		expected := usr.HomeDir + "/test.jpg"
		filename := Abs("~/test.jpg")
		assert.Equal(t, expected, filename)
		assert.IsType(t, "", filename)
	})
}

func TestDirIsEmpty(t *testing.T) {
	t.Run("CurrentDir", func(t *testing.T) {
		assert.Equal(t, false, DirIsEmpty("."))
	})
	t.Run("Testdata", func(t *testing.T) {
		assert.Equal(t, false, DirIsEmpty("./testdata"))
	})
	t.Run("XXX", func(t *testing.T) {
		assert.Equal(t, false, DirIsEmpty("./xxx"))
	})
	t.Run("EmptyDir", func(t *testing.T) {
		if err := os.Mkdir("./testdata/emptyDir", 0777); err != nil {
			t.Fatal(err)
		}
		defer os.RemoveAll("./testdata/emptyDir")
		assert.Equal(t, true, DirIsEmpty("./testdata/emptyDir"))
	})
}
