package gitinfo

import (
	"context"
	"strings"
	"testing"

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

	"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{"master"},
			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])
}
