package watcher

import (
	"context"
	"fmt"
	"testing"

	"github.com/google/uuid"
	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/deepequal/assertdeep"
	"go.skia.org/infra/go/gcs/mem_gcsclient"
	"go.skia.org/infra/go/git"
	"go.skia.org/infra/go/git/repograph"
	git_testutils "go.skia.org/infra/go/git/testutils"
	"go.skia.org/infra/go/gitiles"
	gitiles_testutils "go.skia.org/infra/go/gitiles/testutils"
	"go.skia.org/infra/go/gitstore"
	"go.skia.org/infra/go/gitstore/mocks"
	"go.skia.org/infra/go/mockhttpclient"
	"go.skia.org/infra/go/testutils/unittest"
	"go.skia.org/infra/go/util"
	"go.skia.org/infra/go/vcsinfo"
)

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

	ctx := context.Background()
	ri := repograph.NewMemCacheRepoImpl(nil, nil)
	graph, err := repograph.NewWithRepoImpl(ctx, ri)
	require.NoError(t, err)
	require.Equal(t, 0, graph.Len())
	require.Equal(t, 0, len(graph.Branches()))

	gb := git_testutils.GitInit(t, ctx)
	defer gb.Cleanup()
	gd := git.GitDir(gb.Dir())

	commit := func() *vcsinfo.LongCommit {
		h := gb.CommitGen(ctx, uuid.New().String())
		d, err := gd.Details(ctx, h)
		require.NoError(t, err)
		return d
	}

	test := func(cb *commitBatch, expectCommits, expectBranches int) {
		require.NoError(t, initialIngestCommitBatch(ctx, graph, ri, cb))
		require.Equal(t, expectCommits, graph.Len())
		require.Equal(t, expectBranches, len(graph.Branches()))
	}

	// Empty batch, nothing to do.
	test(&commitBatch{}, 0, 0)

	// Verify that we create a new branch.
	c0 := commit()
	test(&commitBatch{
		branch:  "mybranch", // Don't use the main branch, to make sure we didn't pick it up accidentally.
		commits: []*vcsinfo.LongCommit{c0},
	}, 1, 1)
	require.True(t, util.In("mybranch", graph.Branches()))

	// Verify that we walk the branch head forward for new commits.
	c1 := commit()
	test(&commitBatch{
		branch:  "mybranch",
		commits: []*vcsinfo.LongCommit{c1},
	}, 2, 1)
	require.Equal(t, c1.Hash, graph.BranchHeads()[0].Head)
	require.False(t, isFakeBranch(graph.BranchHeads()[0].Name))

	// Add two commits, both based at c1. Ensure that we create a fake
	// branch for the second one.
	c2 := commit()
	gb.CreateBranchTrackBranch(ctx, "mybranch2", git.MasterBranch)
	gb.Reset(ctx, "--hard", c1.Hash)
	c3 := commit()
	test(&commitBatch{
		branch:  "mybranch",
		commits: []*vcsinfo.LongCommit{c2, c3},
	}, 4, 2)
	var fakeBranch string
	for _, b := range graph.BranchHeads() {
		if b.Name == "mybranch" {
			require.False(t, isFakeBranch(b.Name))
			require.Equal(t, c2.Hash, b.Head)
		} else {
			fakeBranch = b.Name
			require.True(t, isFakeBranch(b.Name))
			require.Equal(t, c3.Hash, b.Head)
		}
	}
	require.NotEqual(t, "", fakeBranch)

	// Add another commit on each branch. Ensure that we walk both branches
	// forward as expected.
	c4 := commit()
	gb.CheckoutBranch(ctx, git.MasterBranch)
	c5 := commit()
	test(&commitBatch{
		branch:  "mybranch",
		commits: []*vcsinfo.LongCommit{c4, c5},
	}, 6, 2)
	for _, b := range graph.BranchHeads() {
		if b.Name == "mybranch" {
			require.False(t, isFakeBranch(b.Name))
			require.Equal(t, c5.Hash, b.Head)
		} else {
			require.Equal(t, fakeBranch, b.Name)
			require.True(t, isFakeBranch(b.Name))
			require.Equal(t, c4.Hash, b.Head)
		}
	}

	// Another commit on each, then merge. Ensure that we kept the real
	// branch, not the fake one.
	c6 := commit()
	gb.CheckoutBranch(ctx, "mybranch2")
	c7 := commit()
	c8Hash := gb.MergeBranch(ctx, git.MasterBranch)
	c8, err := gd.Details(ctx, c8Hash)
	require.NoError(t, err)
	test(&commitBatch{
		branch:  "mybranch",
		commits: []*vcsinfo.LongCommit{c6, c7, c8},
	}, 9, 1)
	b := graph.BranchHeads()[0]
	require.False(t, isFakeBranch(b.Name))
	require.Equal(t, "mybranch", b.Name)
	require.Equal(t, c8.Hash, b.Head)
}

func setupTestInitial(t *testing.T) (context.Context, *git_testutils.GitBuilder, *gitiles_testutils.MockRepo, *repoImpl, func() *vcsinfo.LongCommit, func(int, int), func()) {
	ctx := context.Background()
	g := git_testutils.GitInit(t, ctx)
	gs := mocks.GitStore{}
	gs.On("RangeByTime", ctx, vcsinfo.MinTime, vcsinfo.MaxTime, gitstore.ALL_BRANCHES).Return(nil, nil)
	gs.On("GetBranches", ctx).Return(nil, nil)
	urlMock := mockhttpclient.NewURLMock()
	mockRepo := gitiles_testutils.NewMockRepo(t, g.RepoUrl(), git.GitDir(g.Dir()), urlMock)
	repo := gitiles.NewRepo(g.RepoUrl(), urlMock.Client())
	gcsClient := mem_gcsclient.New("fake-bucket")
	ri, err := newRepoImpl(ctx, &gs, repo, gcsClient, "repo-ingestion", nil, nil, nil)
	require.NoError(t, err)

	gd := git.GitDir(g.Dir())
	commit := func() *vcsinfo.LongCommit {
		h := g.CommitGen(ctx, uuid.New().String())
		c, err := gd.Details(ctx, h)
		require.NoError(t, err)
		return c
	}

	test := func(expectBranches, expectCommits int) {
		// Clear the cache between every attempt.
		ri.(*repoImpl).MemCacheRepoImpl = repograph.NewMemCacheRepoImpl(nil, nil)
		mockRepo.MockBranches(ctx)
		require.NoError(t, ri.(*repoImpl).initialIngestion(ctx))
		require.Equal(t, expectBranches, len(ri.(*repoImpl).BranchList))
		require.Equal(t, expectCommits, len(ri.(*repoImpl).Commits))
		require.True(t, mockRepo.Empty())
	}

	return ctx, g, mockRepo, ri.(*repoImpl), commit, test, g.Cleanup
}

func TestInitialIngestion(t *testing.T) {
	unittest.LargeTest(t)
	ctx, gb, mockRepo, ri, commit, test, cleanup := setupTestInitial(t)
	defer cleanup()

	// No commits, no branches; nothing to do.
	test(0, 0)

	// One commit.
	c0 := commit()
	mockRepo.MockLog(ctx, c0.Hash, gitiles.LogReverse(), gitiles.LogBatchSize(batchSize))
	test(1, 1)
	require.Equal(t, git.MasterBranch, ri.BranchList[0].Name)
	require.Equal(t, c0.Hash, ri.BranchList[0].Head)
	assertdeep.Equal(t, ri.Commits[c0.Hash], c0)

	// No new commits. Clear out the cache and ensure that we don't request
	// the log of c0 again, because it's backed up in GCS.
	test(1, 1)

	// New commits on a non-main branch.
	gb.CreateBranchTrackBranch(ctx, "branch2", git.MasterBranch)
	var newBranchCommits []*vcsinfo.LongCommit
	for i := 0; i < 10; i++ {
		newBranchCommits = append(newBranchCommits, commit())
	}
	last := newBranchCommits[len(newBranchCommits)-1]
	mockRepo.MockLog(ctx, last.Hash, gitiles.LogBatchSize(batchSize))
	test(2, 11)
	for _, b := range ri.BranchList {
		if b.Name == git.MasterBranch {
			require.Equal(t, c0.Hash, b.Head)
		} else {
			require.Equal(t, "branch2", b.Name)
			require.Equal(t, last.Hash, b.Head)
		}
	}

	// New commits on several new branches.
	for i := 0; i < 10; i++ {
		gb.CreateBranchTrackBranch(ctx, fmt.Sprintf("b%d", i), git.MasterBranch)
		commits := []*vcsinfo.LongCommit{}
		for j := 0; j < 10; j++ {
			commits = append(commits, commit())
		}
		last = commits[len(commits)-1]
		mockRepo.MockLog(ctx, last.Hash, gitiles.LogBatchSize(batchSize))
	}
	test(12, 111)

	// One new commit on one of the branches. Ensure that we only request
	// the new commit.
	mockRepo.MockLog(ctx, git.LogFromTo(last.Hash, commit().Hash), gitiles.LogBatchSize(batchSize))
	test(12, 112)
}

func TestInitialIngestionRespectsIncludeBranches(t *testing.T) {
	unittest.LargeTest(t)
	ctx, gb, mockRepo, ri, commit, test, cleanup := setupTestInitial(t)
	defer cleanup()

	// Set includeBranches.
	ri.includeBranches = []string{"branch2"}

	// "branch2" has two commits, while the main branch has three.
	commit()
	gb.CreateBranchTrackBranch(ctx, "branch2", git.MasterBranch)
	branch2Head := commit()
	gb.CheckoutBranch(ctx, git.MasterBranch)
	commit()
	commit()

	mockRepo.MockLog(ctx, branch2Head.Hash, gitiles.LogBatchSize(batchSize))
	test(1, 2)
}
