package gitinfo

import (
	"context"
	"strings"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"

	"go.skia.org/infra/go/git"
	"go.skia.org/infra/go/testutils/unittest"
	vcstu "go.skia.org/infra/go/vcsinfo/testutils"
)

func TestVCSSuite(t *testing.T) {
	unittest.MediumTest(t)
	repoDir, cleanup := vcstu.InitTempRepo()
	defer cleanup()

	ctx := context.Background()
	r, err := NewGitInfo(ctx, repoDir, false, false)
	require.NoError(t, err)
	vcstu.TestDisplay(t, r)
}

func TestFrom(t *testing.T) {
	unittest.MediumTest(t)
	repoDir, cleanup := vcstu.InitTempRepo()
	defer cleanup()

	r, err := NewGitInfo(context.TODO(), repoDir, false, false)
	require.NoError(t, err)
	vcstu.TestFrom(t, r)
}

func TestLastN(t *testing.T) {
	unittest.MediumTest(t)
	repoDir, cleanup := vcstu.InitTempRepo()
	defer cleanup()

	ctx := context.Background()
	r, err := NewGitInfo(ctx, repoDir, false, false)
	if err != nil {
		t.Fatal(err)
	}

	testCases := []struct {
		n      int
		values []string
	}{
		{
			n:      0,
			values: []string{},
		},
		{
			n:      1,
			values: []string{"8652a6df7dc8a7e6addee49f6ed3c2308e36bd18"},
		},
		{
			n:      2,
			values: []string{"7a669cfa3f4cd3482a4fd03989f75efcc7595f7f", "8652a6df7dc8a7e6addee49f6ed3c2308e36bd18"},
		},
		{
			n:      5,
			values: []string{"7a669cfa3f4cd3482a4fd03989f75efcc7595f7f", "8652a6df7dc8a7e6addee49f6ed3c2308e36bd18"},
		},
	}
	for _, tc := range testCases {
		assert.ElementsMatch(t, tc.values, r.LastN(ctx, tc.n))
	}
}

func TestByIndex(t *testing.T) {
	unittest.MediumTest(t)
	repoDir, cleanup := vcstu.InitTempRepo()
	defer cleanup()

	r, err := NewGitInfo(context.TODO(), repoDir, false, false)
	require.NoError(t, err)
	vcstu.TestByIndex(t, r)
}

func TestLastNIndex(t *testing.T) {
	unittest.MediumTest(t)
	repoDir, cleanup := vcstu.InitTempRepo()
	defer cleanup()

	r, err := NewGitInfo(context.TODO(), repoDir, false, false)
	require.NoError(t, err)
	vcstu.TestLastNIndex(t, r)
}

func TestIndexOf(t *testing.T) {
	unittest.MediumTest(t)
	repoDir, cleanup := vcstu.InitTempRepo()
	defer cleanup()

	ctx := context.Background()
	r, err := NewGitInfo(ctx, repoDir, false, false)
	if err != nil {
		t.Fatal(err)
	}
	vcstu.TestIndexOf(t, r)
	require.Equal(t, "7a669cfa3f4cd3482a4fd03989f75efcc7595f7f", r.firstCommit)
}

func TestRange(t *testing.T) {
	unittest.MediumTest(t)
	repoDir, cleanup := vcstu.InitTempRepo()
	defer cleanup()

	r, err := NewGitInfo(context.TODO(), repoDir, false, false)
	require.NoError(t, err)
	vcstu.TestRange(t, r)
}
func TestLog(t *testing.T) {
	unittest.MediumTest(t)
	repoDir, cleanup := vcstu.InitTempRepo()
	defer cleanup()

	ctx := context.Background()
	r, err := NewGitInfo(ctx, repoDir, false, false)
	if err != nil {
		t.Fatal(err)
	}

	got, err := r.Log(ctx, "7a669cfa3f4cd3482a4fd03989f75efcc7595f7f", "")
	if err != nil {
		t.Fatal(err)
	}
	want := `commit 7a669cfa3f4cd3482a4fd03989f75efcc7595f7f
Author: Joe Gregorio <jcgregorio@google.com>
Date:   Wed Jul 30 08:00:42 2014 -0400

    First "checkin"
    ` + "\n" + `    With quotes.

README.txt
`

	if got != want {
		t.Errorf("Log failed: \nGot  %q \nWant %q", got, want)
	}

	got, err = r.Log(ctx, "7a669cfa3f4cd3482a4fd03989f75efcc7595f7f", "8652a6df7dc8a7e6addee49f6ed3c2308e36bd18")
	if err != nil {
		t.Fatal(err)
	}
	want = `commit 8652a6df7dc8a7e6addee49f6ed3c2308e36bd18
Author: Joe Gregorio <jcgregorio@google.com>
Date:   Wed Jul 30 08:01:55 2014 -0400

    Added code. No body.

README.txt
hello.go
`

	if got != want {
		t.Errorf("Log failed: \nGot  %q \nWant %q", got, want)
	}

}

func TestLogFine(t *testing.T) {
	unittest.MediumTest(t)
	repoDir, cleanup := vcstu.InitTempRepo()
	defer cleanup()

	ctx := context.Background()
	r, err := NewGitInfo(ctx, repoDir, false, false)
	if err != nil {
		t.Fatal(err)
	}

	got, err := r.LogFine(ctx, "7a669cfa3f4cd3482a4fd03989f75efcc7595f7f", "", "--format=format:%H")
	if err != nil {
		t.Fatal(err)
	}
	want := `7a669cfa3f4cd3482a4fd03989f75efcc7595f7f`

	if got != want {
		t.Errorf("Log failed: \nGot  %q \nWant %q", got, want)
	}

	got, err = r.LogFine(ctx, "7a669cfa3f4cd3482a4fd03989f75efcc7595f7f", "8652a6df7dc8a7e6addee49f6ed3c2308e36bd18", "--format=format:%H")
	if err != nil {
		t.Fatal(err)
	}
	want = `8652a6df7dc8a7e6addee49f6ed3c2308e36bd18`

	if got != want {
		t.Errorf("Log failed: \nGot  %q \nWant %q", got, want)
	}
}

func TestLogArgs(t *testing.T) {
	unittest.MediumTest(t)
	repoDir, cleanup := vcstu.InitTempRepo()
	defer cleanup()

	ctx := context.Background()
	r, err := NewGitInfo(ctx, repoDir, false, false)
	if err != nil {
		t.Fatal(err)
	}
	got, err := r.LogArgs(ctx, "7a669cfa3f4cd3482a4fd03989f75efcc7595f7f..8652a6df7dc8a7e6addee49f6ed3c2308e36bd18", "--format=format:%H")
	if err != nil {
		t.Fatal(err)
	}
	want := `8652a6df7dc8a7e6addee49f6ed3c2308e36bd18`
	if got != want {
		t.Errorf("Log failed: \nGot  %q \nWant %q", got, want)
	}

}

func TestShortList(t *testing.T) {
	unittest.MediumTest(t)
	repoDir, cleanup := vcstu.InitTempRepo()
	defer cleanup()

	ctx := context.Background()
	r, err := NewGitInfo(ctx, repoDir, false, false)
	if err != nil {
		t.Fatal(err)
	}

	l, err := r.ShortList(ctx, "8652a6df7dc8a7e6addee49f6ed3c2308e36bd18", "8652a6df7dc8a7e6addee49f6ed3c2308e36bd18")
	if err != nil {
		t.Fatal(err)
	}

	if got, want := len(l.Commits), 0; got != want {
		t.Fatalf("Wrong number of zero results: Got %v Want %v", got, want)
	}

	c, err := r.ShortList(ctx, "7a669cfa3f4cd3482a4fd03989f75efcc7595f7f", "8652a6df7dc8a7e6addee49f6ed3c2308e36bd18")
	if err != nil {
		t.Fatal(err)
	}

	expected := []struct {
		Hash    string
		Author  string
		Subject string
	}{
		{
			Hash:    "8652a6df7dc8a7e6addee49f6ed3c2308e36bd18",
			Author:  "Joe Gregorio",
			Subject: "Added code. No body.",
		},
	}
	if got, want := len(c.Commits), len(expected); got != want {
		t.Fatalf("Wrong number of results: Got %v Want %v", got, want)
	}
	for i, o := range c.Commits {
		if got, want := o.Hash, expected[i].Hash; got != want {
			t.Errorf("Wrong hash: Got %v Want %v", got, want)
		}
		if got, want := o.Author, expected[i].Author; got != want {
			t.Errorf("Wrong author: Got %v Want %v", got, want)
		}
		if got, want := o.Subject, expected[i].Subject; got != want {
			t.Errorf("Wrong subject: Got %v Want %v", got, want)
		}
	}
}

func TestRevList(t *testing.T) {
	unittest.MediumTest(t)
	repoDir, cleanup := vcstu.InitTempRepo()
	defer cleanup()

	ctx := context.Background()
	r, err := NewGitInfo(ctx, repoDir, false, true)
	if err != nil {
		t.Fatal(err)
	}

	const rev1 = "7a669cfa3f4cd3482a4fd03989f75efcc7595f7f"
	const rev2 = "8652a6df7dc8a7e6addee49f6ed3c2308e36bd18"
	revs := []string{rev2, rev1} // rev-list is reverse-chronological.
	testCases := []struct {
		Input    []string
		Expected []string
	}{
		{
			Input:    []string{git.DefaultBranch},
			Expected: revs,
		},
		{
			Input:    []string{"HEAD"},
			Expected: revs,
		},
		{
			Input:    []string{"7a669cf..8652a6d"},
			Expected: []string{rev2},
		},
		{
			Input:    []string{"8652a6d", "^7a669cf"},
			Expected: []string{rev2},
		},
		{
			Input:    []string{"8652a6d..7a669cf"},
			Expected: []string{},
		},
	}
	for _, tc := range testCases {
		actual, err := r.RevList(ctx, tc.Input...)
		if err != nil {
			t.Fatal(err)
		}
		assert.Equal(t, tc.Expected, actual, "Failed test for: git rev-list %s\nGot:  %v\nWant: %v", strings.Join(tc.Input, " "), actual, tc.Expected)
	}
}

func TestBranchInfo(t *testing.T) {
	unittest.MediumTest(t)
	repoDir, cleanup := vcstu.InitTempRepo()
	defer cleanup()

	ctx := context.Background()
	r, err := NewGitInfo(ctx, repoDir, false, true)
	if err != nil {
		t.Fatal(err)
	}

	allBranches, err := r.GetBranches(ctx)
	require.NoError(t, err)
	branches := []string{}
	for _, b := range allBranches {
		branches = append(branches, b.Name)
	}
	vcstu.TestBranchInfo(t, r, branches)
}

func TestSetBranch(t *testing.T) {
	unittest.MediumTest(t)
	repoDir, cleanup := vcstu.InitTempRepo()
	defer cleanup()

	ctx := context.Background()
	r, err := NewGitInfo(ctx, repoDir, false, true)
	if err != nil {
		t.Fatal(err)
	}

	branches, err := r.GetBranches(ctx)
	require.NoError(t, err)
	require.Equal(t, 2, len(branches))

	err = r.Checkout(ctx, "test-branch-1")
	require.NoError(t, err)

	commits := r.LastN(ctx, 10)
	require.Equal(t, 3, len(commits))
	require.Equal(t, "3f5a807d432ac232a952bbf223bc6952e4b49b2c", commits[2])
}
