package layer

import (
	"testing"

	"git.frostfs.info/TrueCloudLab/frostfs-s3-gw/api/data"
	oid "git.frostfs.info/TrueCloudLab/frostfs-sdk-go/object/id"
	"github.com/stretchr/testify/require"
)

func newTestNodeVersion(id oid.ID, name string) *data.NodeVersion {
	return &data.NodeVersion{
		BaseNodeVersion: data.BaseNodeVersion{
			OID:      id,
			FilePath: name,
		},
	}
}

func TestTryDirectory(t *testing.T) {
	var id oid.ID

	cases := []struct {
		name      string
		prefix    string
		result    string
		node      *data.NodeVersion
		delimiter string
	}{
		{
			name:   "small.jpg",
			result: "",
			node:   newTestNodeVersion(id, "small.jpg"),
		},
		{
			name:   "small.jpg not matched prefix",
			prefix: "big",
			result: "",
			node:   newTestNodeVersion(id, "small.jpg"),
		},
		{
			name:      "small.jpg delimiter",
			delimiter: "/",
			result:    "",
			node:      newTestNodeVersion(id, "small.jpg"),
		},
		{
			name:   "test/small.jpg",
			result: "",
			node:   newTestNodeVersion(id, "test/small.jpg"),
		},
		{
			name:      "test/small.jpg with prefix and delimiter",
			prefix:    "test/",
			delimiter: "/",
			result:    "",
			node:      newTestNodeVersion(id, "test/small.jpg"),
		},
		{
			name:   "a/b/small.jpg",
			prefix: "a",
			result: "",
			node:   newTestNodeVersion(id, "a/b/small.jpg"),
		},
		{
			name:      "a/b/small.jpg",
			prefix:    "a/",
			delimiter: "/",
			result:    "a/b/",
			node:      newTestNodeVersion(id, "a/b/small.jpg"),
		},
		{
			name:      "a/b/c/small.jpg",
			prefix:    "a/",
			delimiter: "/",
			result:    "a/b/",
			node:      newTestNodeVersion(id, "a/b/c/small.jpg"),
		},
		{
			name:      "a/b/c/small.jpg",
			prefix:    "a/b/c/s",
			delimiter: "/",
			result:    "",
			node:      newTestNodeVersion(id, "a/b/c/small.jpg"),
		},
		{
			name:      "a/b/c/big.jpg",
			prefix:    "a/b/",
			delimiter: "/",
			result:    "a/b/c/",
			node:      newTestNodeVersion(id, "a/b/c/big.jpg"),
		},
	}

	for _, tc := range cases {
		t.Run(tc.name, func(t *testing.T) {
			dirName := tryDirectoryName(tc.node, tc.prefix, tc.delimiter)
			require.Equal(t, tc.result, dirName)
		})
	}
}