package graph

import (
	"testing"

	"github.com/alcionai/clues"
	"github.com/stretchr/testify/require"
	"github.com/stretchr/testify/suite"

	"github.com/alcionai/corso/src/internal/tester"
	"github.com/alcionai/corso/src/pkg/path"
)

type CollectionsUnitSuite struct {
	tester.Suite
}

func TestCollectionsUnitSuite(t *testing.T) {
	suite.Run(t, &CollectionsUnitSuite{Suite: tester.NewUnitSuite(t)})
}

func (suite *CollectionsUnitSuite) TestNewPrefixCollection() {
	t := suite.T()
	serv := path.OneDriveService
	cat := path.FilesCategory

	p1, err := path.ServicePrefix("t", "ro1", serv, cat)
	require.NoError(t, err, clues.ToCore(err))

	p2, err := path.ServicePrefix("t", "ro2", serv, cat)
	require.NoError(t, err, clues.ToCore(err))

	items, err := path.Build("t", "ro", serv, cat, true, "fld", "itm")
	require.NoError(t, err, clues.ToCore(err))

	folders, err := path.Build("t", "ro", serv, cat, false, "fld")
	require.NoError(t, err, clues.ToCore(err))

	table := []struct {
		name      string
		prev      path.Path
		full      path.Path
		expectErr require.ErrorAssertionFunc
	}{
		{
			name:      "not moved",
			prev:      p1,
			full:      p1,
			expectErr: require.NoError,
		},
		{
			name:      "moved",
			prev:      p1,
			full:      p2,
			expectErr: require.NoError,
		},
		{
			name:      "deleted",
			prev:      p1,
			full:      nil,
			expectErr: require.Error,
		},
		{
			name:      "new",
			prev:      nil,
			full:      p2,
			expectErr: require.Error,
		},
		{
			name:      "prev has items",
			prev:      items,
			full:      p1,
			expectErr: require.Error,
		},
		{
			name:      "prev has folders",
			prev:      folders,
			full:      p1,
			expectErr: require.Error,
		},
		{
			name:      "full has items",
			prev:      p1,
			full:      items,
			expectErr: require.Error,
		},
		{
			name:      "full has folders",
			prev:      p1,
			full:      folders,
			expectErr: require.Error,
		},
	}
	for _, test := range table {
		suite.Run(test.name, func() {
			_, err := NewPrefixCollection(test.prev, test.full, nil)
			test.expectErr(suite.T(), err, clues.ToCore(err))
		})
	}
}
