package shared_tests

import (
	"context"
	"math"
	"time"

	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/deepequal/assertdeep"
	"go.skia.org/infra/go/git/testutils/mem_git"
	"go.skia.org/infra/go/gitstore"
	"go.skia.org/infra/go/sktest"
	"go.skia.org/infra/go/vcsinfo"
)

func TestGitStore(t sktest.TestingT, gs gitstore.GitStore) {
	ctx := context.Background()

	// Empty to start.
	branches, err := gs.GetBranches(ctx)
	require.NoError(t, err)
	require.Equal(t, 0, len(branches))
	lcs, err := gs.Get(ctx, []string{"a", "b", "c"})
	require.NoError(t, err)
	require.Equal(t, 3, len(lcs))
	for _, lc := range lcs {
		require.Nil(t, lc)
	}
	ics, err := gs.RangeN(ctx, math.MinInt32, math.MaxInt32, gitstore.ALL_BRANCHES)
	require.NoError(t, err)
	require.Equal(t, 0, len(ics))
	ics, err = gs.RangeByTime(ctx, time.Time{}, vcsinfo.MaxTime, gitstore.ALL_BRANCHES)
	require.NoError(t, err)
	require.Equal(t, 0, len(ics))

	// Put a commit, but don't update the branch head. It should show up in
	// results of Get() and Range, but the master branch should not be
	// updated.
	master := "master"
	c0 := mem_git.FakeCommit(t, "c0", master)
	require.NoError(t, gs.Put(ctx, []*vcsinfo.LongCommit{c0}))
	branches, err = gs.GetBranches(ctx)
	require.NoError(t, err)
	require.Nil(t, branches[master])
	lcs, err = gs.Get(ctx, []string{"a", "b", c0.Hash})
	require.NoError(t, err)
	require.Equal(t, 3, len(lcs))
	require.Nil(t, lcs[0])
	require.Nil(t, lcs[1])
	assertdeep.Equal(t, c0, lcs[2])
	ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, gitstore.ALL_BRANCHES)
	require.NoError(t, err)
	require.Equal(t, 1, len(ics))
	assertdeep.Equal(t, c0.IndexCommit(), ics[0])
	ics, err = gs.RangeByTime(ctx, time.Time{}, vcsinfo.MaxTime, gitstore.ALL_BRANCHES)
	require.NoError(t, err)
	require.Equal(t, 1, len(ics))
	assertdeep.Equal(t, c0.IndexCommit(), ics[0])
	ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, master)
	require.NoError(t, err)
	require.Equal(t, 0, len(ics))
	ics, err = gs.RangeByTime(ctx, vcsinfo.MinTime, vcsinfo.MaxTime, master)
	require.NoError(t, err)
	require.Equal(t, 0, len(ics))

	// Put the master branch.
	require.NoError(t, gs.PutBranches(ctx, map[string]string{
		master: c0.Hash,
	}))
	branches, err = gs.GetBranches(ctx)
	require.NoError(t, err)
	require.NotNil(t, branches[master])
	require.Equal(t, c0.Hash, branches[master].Head)
	require.Equal(t, 0, branches[master].Index)
	ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, master)
	require.NoError(t, err)
	require.Equal(t, 1, len(ics))
	assertdeep.Equal(t, c0.IndexCommit(), ics[0])
	ics, err = gs.RangeByTime(ctx, vcsinfo.MinTime, vcsinfo.MaxTime, master)
	require.NoError(t, err)
	require.Equal(t, 1, len(ics))
	assertdeep.Equal(t, c0.IndexCommit(), ics[0])

	// Add a second commit.
	c1 := mem_git.FakeCommit(t, "c1", master, c0)
	require.NoError(t, gs.Put(ctx, []*vcsinfo.LongCommit{c1}))
	branches, err = gs.GetBranches(ctx)
	require.NoError(t, err)
	require.NotNil(t, branches[master])
	require.Equal(t, c0.Hash, branches[master].Head)
	lcs, err = gs.Get(ctx, []string{c1.Hash})
	require.NoError(t, err)
	require.Equal(t, 1, len(lcs))
	assertdeep.Equal(t, c1, lcs[0])
	ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, gitstore.ALL_BRANCHES)
	require.NoError(t, err)
	require.Equal(t, 2, len(ics))
	assertdeep.Equal(t, c0.IndexCommit(), ics[0])
	ics, err = gs.RangeByTime(ctx, time.Time{}, vcsinfo.MaxTime, gitstore.ALL_BRANCHES)
	require.NoError(t, err)
	require.Equal(t, 2, len(ics))
	assertdeep.Equal(t, c0.IndexCommit(), ics[0])
	ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, master)
	require.NoError(t, err)
	require.Equal(t, 1, len(ics))
	ics, err = gs.RangeByTime(ctx, vcsinfo.MinTime, vcsinfo.MaxTime, master)
	require.NoError(t, err)
	require.Equal(t, 1, len(ics))
	require.NoError(t, gs.PutBranches(ctx, map[string]string{
		master: c1.Hash,
	}))
	branches, err = gs.GetBranches(ctx)
	require.NoError(t, err)
	require.NotNil(t, branches[master])
	require.Equal(t, c1.Hash, branches[master].Head)
	require.Equal(t, 1, branches[master].Index)
	ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, master)
	require.NoError(t, err)
	require.Equal(t, 2, len(ics))
	assertdeep.Equal(t, c0.IndexCommit(), ics[0])
	assertdeep.Equal(t, c1.IndexCommit(), ics[1])
	ics, err = gs.RangeByTime(ctx, vcsinfo.MinTime, vcsinfo.MaxTime, master)
	require.NoError(t, err)
	require.Equal(t, 2, len(ics))
	assertdeep.Equal(t, c0.IndexCommit(), ics[0])
	assertdeep.Equal(t, c1.IndexCommit(), ics[1])

	// Add a new branch.
	otherbranch := "otherbranch"
	c2 := mem_git.FakeCommit(t, "c2", otherbranch, c0)
	c0.Branches[otherbranch] = true // Re-insert c0 so that it shows up as part of otherbranch.
	require.NoError(t, gs.Put(ctx, []*vcsinfo.LongCommit{c0, c2}))
	branches, err = gs.GetBranches(ctx)
	require.NoError(t, err)
	require.Nil(t, branches[otherbranch])
	lcs, err = gs.Get(ctx, []string{c2.Hash})
	require.NoError(t, err)
	require.Equal(t, 1, len(lcs))
	assertdeep.Equal(t, c2, lcs[0])
	// Note: Behavior for ALL_BRANCHES is undefined for RangeN when there
	// are multiple branches with overlapping indexes, so we don't check
	// that here.
	ics, err = gs.RangeByTime(ctx, time.Time{}, vcsinfo.MaxTime, gitstore.ALL_BRANCHES)
	require.NoError(t, err)
	require.Equal(t, 3, len(ics))
	assertdeep.Equal(t, c0.IndexCommit(), ics[0])
	// RangeByTime sorts by index, and c1 and c2 both have index 1.
	if ics[1].Hash == c1.Hash {
		assertdeep.Equal(t, c1.IndexCommit(), ics[1])
		assertdeep.Equal(t, c2.IndexCommit(), ics[2])
	} else {
		assertdeep.Equal(t, c1.IndexCommit(), ics[2])
		assertdeep.Equal(t, c2.IndexCommit(), ics[1])
	}
	ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, otherbranch)
	require.NoError(t, err)
	require.Equal(t, 0, len(ics))
	ics, err = gs.RangeByTime(ctx, vcsinfo.MinTime, vcsinfo.MaxTime, otherbranch)
	require.NoError(t, err)
	require.Equal(t, 0, len(ics))
	require.NoError(t, gs.PutBranches(ctx, map[string]string{
		otherbranch: c2.Hash,
	}))
	branches, err = gs.GetBranches(ctx)
	require.NoError(t, err)
	require.NotNil(t, branches[otherbranch])
	require.Equal(t, c2.Hash, branches[otherbranch].Head)
	require.Equal(t, 1, branches[otherbranch].Index)
	ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, otherbranch)
	require.NoError(t, err)
	require.Equal(t, 2, len(ics))
	assertdeep.Equal(t, c0.IndexCommit(), ics[0])
	assertdeep.Equal(t, c2.IndexCommit(), ics[1])
	ics, err = gs.RangeByTime(ctx, vcsinfo.MinTime, vcsinfo.MaxTime, otherbranch)
	require.NoError(t, err)
	require.Equal(t, 2, len(ics))
	assertdeep.Equal(t, c0.IndexCommit(), ics[0])
	assertdeep.Equal(t, c2.IndexCommit(), ics[1])
	ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, master)
	require.NoError(t, err)
	require.Equal(t, 2, len(ics))
	assertdeep.Equal(t, c0.IndexCommit(), ics[0])
	assertdeep.Equal(t, c1.IndexCommit(), ics[1])
	ics, err = gs.RangeByTime(ctx, vcsinfo.MinTime, vcsinfo.MaxTime, master)
	require.NoError(t, err)
	require.Equal(t, 2, len(ics))
	assertdeep.Equal(t, c0.IndexCommit(), ics[0])
	assertdeep.Equal(t, c1.IndexCommit(), ics[1])
}
