package fileutil

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

	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/deepequal"
	"go.skia.org/infra/go/testutils/unittest"
)

const (
	TEST_DATA_DIR = "./testdata"
)

func TestTwoLevelRadixPath(t *testing.T) {
	unittest.SmallTest(t)
	require.Equal(t, "", TwoLevelRadixPath(""))
	require.Equal(t, filepath.Join("ab", "cd", "abcdefgh.txt"), TwoLevelRadixPath("abcdefgh.txt"))
	require.Equal(t, filepath.Join("/etc", "xyz", "ab.txt"), TwoLevelRadixPath("/etc", "xyz/ab.txt"))
	require.Equal(t, filepath.Join("/etc", "xyz", "ab", "cd", "abcdefg.txt"), TwoLevelRadixPath("/etc", "xyz/abcdefg.txt"))
	require.Equal(t, filepath.Join("so", "me", "somefile_no_ext"), TwoLevelRadixPath("somefile_no_ext"))
}

func TestCountLines(t *testing.T) {
	unittest.MediumTest(t)

	lines, err := CountLines(filepath.Join(TEST_DATA_DIR, "no_lines_file.txt"))
	require.Nil(t, err)
	require.Equal(t, 0, lines)

	lines, err = CountLines(filepath.Join(TEST_DATA_DIR, "one_line_file.txt"))
	require.Nil(t, err)
	require.Equal(t, 1, lines)

	lines, err = CountLines(filepath.Join(TEST_DATA_DIR, "ten_lines_file.txt"))
	require.Nil(t, err)
	require.Equal(t, 10, lines)

	lines, err = CountLines(filepath.Join(TEST_DATA_DIR, "non_existant.txt"))
	require.NotNil(t, err)
	require.Equal(t, -1, lines)
}

func TestReadAllFilesRecursive(t *testing.T) {
	unittest.LargeTest(t)

	test := func(write, expect map[string]string, excludeDirs []string) {
		wd, err := ioutil.TempDir("", "")
		require.NoError(t, err)
		for k, v := range write {
			dir := filepath.Dir(k)
			if dir != "" {
				require.NoError(t, os.MkdirAll(filepath.Join(wd, dir), os.ModePerm))
			}
			require.NoError(t, ioutil.WriteFile(filepath.Join(wd, k), []byte(v), os.ModePerm))
		}
		actual, err := ReadAllFilesRecursive(wd, excludeDirs)
		require.NoError(t, err)
		expectBytes := make(map[string][]byte, len(expect))
		for k, v := range expect {
			expectBytes[k] = []byte(v)
		}
		deepequal.AssertDeepEqual(t, expectBytes, actual)
	}
	test(nil, map[string]string{}, nil)
	test(map[string]string{
		"somefile": "contents",
	}, map[string]string{
		"somefile": "contents",
	}, nil)
	test(map[string]string{
		filepath.Join("a", "b", "c"): "contents",
	}, map[string]string{
		filepath.Join("a", "b", "c"): "contents",
	}, nil)
	test(map[string]string{
		filepath.Join("a", "file"): "contents",
		filepath.Join("b", "file"): "contents",
	}, map[string]string{
		filepath.Join("b", "file"): "contents",
	}, []string{"a"})
}
