package fileutil

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

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

const (
	TEST_DATA_DIR = "./testdata"
)

func TestTwoLevelRadixPath(t *testing.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) {

	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) {

	test := func(write, expect map[string]string, excludeDirs []string) {
		wd, err := os.MkdirTemp("", "")
		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, os.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)
		}
		assertdeep.Equal(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"})
}
