package gerrit

import (
	"context"
	"fmt"
	"net/http"
	"net/http/httptest"
	"testing"
	"time"

	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/httputils"
	"go.skia.org/infra/go/testutils/unittest"
)

const (
	// Flip this boolean to run the below E2E Gerrit tests. Requires a valid
	// ~/.gitcookies file.
	RUN_GERRIT_TESTS = false
)

var (
	// http.Client used for testing.
	c = httputils.NewTimeoutClient()
)

func skipTestIfRequired(t *testing.T) {
	if !RUN_GERRIT_TESTS {
		t.Skip("Skipping test due to RUN_GERRIT_TESTS=false")
	}
	unittest.LargeTest(t)
}

func TestHasOpenDependency(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	dep, err := api.HasOpenDependency(context.Background(), 52160, 1)
	require.NoError(t, err)
	require.False(t, dep)

	dep2, err := api.HasOpenDependency(context.Background(), 52123, 1)
	require.NoError(t, err)
	require.True(t, dep2)
}

func TestGerritOwnerModifiedSearch(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	tDelta := time.Now().Add(-10 * 24 * time.Hour)
	issues, err := api.Search(context.Background(), 1, true, SearchModifiedAfter(tDelta), SearchOwner("rmistry@google.com"))
	require.NoError(t, err)
	require.True(t, len(issues) > 0)

	for _, issue := range issues {
		details, err := api.GetIssueProperties(context.Background(), issue.Issue)
		require.NoError(t, err)
		require.True(t, details.Updated.After(tDelta))
		require.True(t, len(details.Patchsets) > 0)
		require.Equal(t, "rmistry@google.com", details.Owner.Email)
	}

	issues, err = api.Search(context.Background(), 2, true, SearchModifiedAfter(time.Now().Add(-time.Hour)))
	require.NoError(t, err)
}

func TestGerritCommitSearch(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	issues, err := api.Search(context.Background(), 1, true, SearchCommit("a2eb235a16ed430896cc54989e683cf930319eb7"))
	require.NoError(t, err)
	require.Equal(t, 1, len(issues))

	for _, issue := range issues {
		details, err := api.GetIssueProperties(context.Background(), issue.Issue)
		require.NoError(t, err)
		require.Equal(t, 5, len(details.Patchsets))
		require.Equal(t, "rmistry@google.com", details.Owner.Email)
		require.Equal(t, "I37876c6f62c85d0532b22dcf8bea8b4e7f4147c0", details.ChangeId)
		require.True(t, details.Committed)
		require.Equal(t, "Skia Gerrit 10k!", details.Subject)
	}
}

// It is a little different to test the poller. Enable this to turn on the
// poller and test removing issues from it.
func GerritPollerTest(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	cache := NewCodeReviewCache(api, 10*time.Second, 3)
	fmt.Println(cache.Get(2386))
	c1 := ChangeInfo{
		Issue: 2386,
	}
	cache.Add(2386, &c1)
	fmt.Println(cache.Get(2386))
	time.Sleep(time.Hour)
}

func TestGetPatch(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	patch, err := api.GetPatch(context.Background(), 2370, "current")
	require.NoError(t, err)

	// Note: The trailing spaces and newlines were added this way
	// because editor plug-ins remove white spaces from the raw string.
	expected := `

diff --git a/whitespace.txt b/whitespace.txt
index c0f0a49..d5733b3 100644
--- a/whitespace.txt
+++ b/whitespace.txt
@@ -1,4 +1,5 @@
 testing
+` + "\n  \n \n \n"

	require.Equal(t, expected, patch)
}

func TestAddCC(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	changeInfo, err := api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	err = api.AddCC(context.Background(), changeInfo, []string{"test-user1@google.com", "test-user2@google.com"})
	require.NoError(t, err)
}

func TestAddComment(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	changeInfo, err := api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	err = api.AddComment(context.Background(), changeInfo, "Testing API!!")
	require.NoError(t, err)
}

func TestSendToDryRun(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	// Send to dry run.
	changeInfo, err := api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	defaultLabelValue := changeInfo.Labels[LabelCommitQueue].DefaultValue
	err = api.SendToDryRun(context.Background(), changeInfo, "Sending to dry run")
	require.NoError(t, err)

	// Wait for a second for the above to take place.
	time.Sleep(time.Second)

	// Verify that the change was sent to dry run.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, 1, changeInfo.Labels[LabelCommitQueue].All[0].Value)

	// Remove from dry run.
	err = api.RemoveFromCQ(context.Background(), changeInfo, "")
	require.NoError(t, err)

	// Verify that the change was removed from dry run.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, defaultLabelValue, changeInfo.Labels[LabelCommitQueue].All[0].Value)
}

func TestSendToCQ(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	// Send to CQ.
	changeInfo, err := api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	defaultLabelValue := changeInfo.Labels[LabelCommitQueue].DefaultValue
	err = api.SendToCQ(context.Background(), changeInfo, "Sending to CQ")
	require.NoError(t, err)

	// Wait for a few seconds for the above to take place.
	time.Sleep(5 * time.Second)

	// Verify that the change was sent to CQ.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, 2, changeInfo.Labels[LabelCommitQueue].All[0].Value)

	// Remove from CQ.
	err = api.RemoveFromCQ(context.Background(), changeInfo, "")
	require.NoError(t, err)

	// Verify that the change was removed from CQ.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, defaultLabelValue, changeInfo.Labels[LabelCommitQueue].All[0].Value)
}

func TestApprove(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	// Approve.
	changeInfo, err := api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	defaultLabelValue := changeInfo.Labels[LabelCodeReview].DefaultValue
	err = api.Approve(context.Background(), changeInfo, "LGTM")
	require.NoError(t, err)

	// Wait for a second for the above to take place.
	time.Sleep(time.Second)

	// Verify that the change was approved.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, 1, changeInfo.Labels[LabelCodeReview].All[0].Value)

	// Remove approval.
	err = api.NoScore(context.Background(), changeInfo, "")
	require.NoError(t, err)

	// Verify that the change has no score.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, defaultLabelValue, changeInfo.Labels[LabelCodeReview].All[0].Value)
}

func TestReadOnlyFailure(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	// Approve.
	changeInfo, err := api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	err = api.Approve(context.Background(), changeInfo, "LGTM")
	require.Error(t, err)
}

func TestDisApprove(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	// DisApprove.
	changeInfo, err := api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	defaultLabelValue := changeInfo.Labels[LabelCodeReview].DefaultValue
	err = api.Disapprove(context.Background(), changeInfo, "not LGTM")
	require.NoError(t, err)

	// Wait for a second for the above to take place.
	time.Sleep(time.Second)

	// Verify that the change was disapproved.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, -1, changeInfo.Labels[LabelCodeReview].All[0].Value)

	// Remove disapproval.
	err = api.NoScore(context.Background(), changeInfo, "")
	require.NoError(t, err)

	// Verify that the change has no score.
	changeInfo, err = api.GetIssueProperties(context.Background(), 2370)
	require.NoError(t, err)
	require.Equal(t, defaultLabelValue, changeInfo.Labels[LabelCodeReview].All[0].Value)
}

func TestAbandon(t *testing.T) {
	skipTestIfRequired(t)

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)
	c1 := ChangeInfo{
		ChangeId: "Idb96a747c8446126f60fdf1adca361dbc2e539d5",
	}
	err = api.Abandon(context.Background(), &c1, "Abandoning this CL")
	require.Error(t, err, "Got status 409 Conflict (409)")
}

func TestGetAbandonReason(t *testing.T) {
	unittest.SmallTest(t)

	// Messages that will be used by tests.
	msgWithAbandonFromUser := ChangeInfoMessage{
		Tag:     "something",
		Message: "Abandoned",
	}
	msgWithAbandonAutogenerated := ChangeInfoMessage{
		Tag:     "autogenerated:gerrit:abandon",
		Message: "Abandoned",
	}
	msgWithAbandonPrefixAndMsgAutogenerated := ChangeInfoMessage{
		Tag:     "autogenerated:gerrit:abandon",
		Message: "Abandoned\n\nTesting testing",
	}
	msgWithNoPrefixAndMsgAutogenerated := ChangeInfoMessage{
		Tag:     "autogenerated:gerrit:abandon",
		Message: "Something",
	}

	tests := []struct {
		status                string
		messages              []ChangeInfoMessage
		expectedAbandonReason string
		failureMessage        string
	}{
		{
			status:                ChangeStatusAbandoned,
			messages:              []ChangeInfoMessage{msgWithAbandonFromUser, msgWithAbandonPrefixAndMsgAutogenerated},
			expectedAbandonReason: "Testing testing",
			failureMessage:        "autogenerated abandon messages with prefix should return message without prefix",
		},
		{
			status:                ChangeStatusNew,
			messages:              []ChangeInfoMessage{msgWithAbandonFromUser, msgWithAbandonPrefixAndMsgAutogenerated},
			expectedAbandonReason: "",
			failureMessage:        "non-abandoned changes have no abandon message"},
		{
			status:                ChangeStatusAbandoned,
			messages:              []ChangeInfoMessage{msgWithAbandonFromUser, msgWithAbandonAutogenerated},
			expectedAbandonReason: "",
			failureMessage:        "autogenerated abandon messages with only prefix should return an empty message"},
		{
			status:                ChangeStatusAbandoned,
			messages:              []ChangeInfoMessage{msgWithAbandonFromUser, msgWithNoPrefixAndMsgAutogenerated},
			expectedAbandonReason: "Something",
			failureMessage:        "autogenerated abandon messages with no prefix should return the specified message"},
		{
			status:                ChangeStatusAbandoned,
			messages:              []ChangeInfoMessage{msgWithAbandonFromUser},
			expectedAbandonReason: "",
			failureMessage:        "abandon messages from users are ignored"},
	}
	for _, test := range tests {
		changeInfo := ChangeInfo{
			Status:   test.status,
			Messages: test.messages,
		}
		require.Equal(t, test.expectedAbandonReason, changeInfo.GetAbandonReason(context.Background()), test.failureMessage)
	}
}

func TestFiles(t *testing.T) {
	unittest.SmallTest(t)
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		_, err := fmt.Fprintln(w, `)]}'
{
  "/COMMIT_MSG": {
    "status": "A",
    "lines_inserted": 10,
    "size_delta": 353,
    "size": 353
  },
  "BUILD.gn": {
    "lines_inserted": 20,
    "lines_deleted": 5,
    "size_delta": 531,
    "size": 50072
  },
  "include/gpu/vk/GrVkDefines.h": {
    "lines_inserted": 28,
    "lines_deleted": 21,
    "size_delta": 383,
    "size": 1615
  },
  "tools/gpu/vk/GrVulkanDefines.h": {
    "status": "A",
    "lines_inserted": 33,
    "size_delta": 861,
    "size": 861
  }
}`)
		require.NoError(t, err)
	}))

	defer ts.Close()

	api, err := NewGerritWithConfig(ConfigChromium, ts.URL, c)
	files, err := api.Files(context.Background(), 12345678, "current")
	require.NoError(t, err)
	require.Len(t, files, 4)
	require.Contains(t, files, "/COMMIT_MSG")
	require.Equal(t, 353, files["/COMMIT_MSG"].Size)
	require.Contains(t, files, "tools/gpu/vk/GrVulkanDefines.h")
	require.Equal(t, 33, files["tools/gpu/vk/GrVulkanDefines.h"].LinesInserted)

	files, err = api.Files(context.Background(), 12345678, "alert()")
	require.Error(t, err)
}

func TestGetFileNames(t *testing.T) {
	unittest.SmallTest(t)
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		_, err := fmt.Fprintln(w, `)]}'
{
  "/COMMIT_MSG": {
    "status": "A",
    "lines_inserted": 10,
    "size_delta": 353,
    "size": 353
  },
  "BUILD.gn": {
    "lines_inserted": 20,
    "lines_deleted": 5,
    "size_delta": 531,
    "size": 50072
  },
  "include/gpu/vk/GrVkDefines.h": {
    "lines_inserted": 28,
    "lines_deleted": 21,
    "size_delta": 383,
    "size": 1615
  },
  "tools/gpu/vk/GrVulkanDefines.h": {
    "status": "A",
    "lines_inserted": 33,
    "size_delta": 861,
    "size": 861
  }
}`)
		require.NoError(t, err)
	}))

	defer ts.Close()

	api, err := NewGerritWithConfig(ConfigChromium, ts.URL, c)
	files, err := api.GetFileNames(context.Background(), 12345678, "current")
	require.NoError(t, err)
	require.Len(t, files, 4)
	require.Contains(t, files, "/COMMIT_MSG")
	require.Contains(t, files, "tools/gpu/vk/GrVulkanDefines.h")
}

func TestSubmittedTogether(t *testing.T) {
	unittest.SmallTest(t)
	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		_, err := fmt.Fprintln(w, `)]}'
{
	"changes": [
		{
			"id": "change1"
		},
		{
			"id": "change2"
		}
	],
	"non_visible_changes": 1
}`)
		require.NoError(t, err)
	}))
	defer ts.Close()

	api, err := NewGerritWithConfig(ConfigChromium, ts.URL, c)
	ci := &ChangeInfo{Issue: int64(123)}
	submittedTogether, nonVisible, err := api.SubmittedTogether(context.Background(), ci)
	require.NoError(t, err)
	require.Len(t, submittedTogether, 2)
	require.Equal(t, "change1", submittedTogether[0].Id)
	require.Equal(t, "change2", submittedTogether[1].Id)
	require.Equal(t, 1, nonVisible)
}

func TestIsBinaryPatch(t *testing.T) {
	unittest.SmallTest(t)

	tsNoBinary := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		_, err := fmt.Fprintln(w, `)]}'
{
  "/COMMIT_MSG": {
    "status": "A",
    "lines_inserted": 10,
    "size_delta": 353,
    "size": 353
  }
}`)
		require.NoError(t, err)
	}))
	defer tsNoBinary.Close()
	api, err := NewGerritWithConfig(ConfigChromium, tsNoBinary.URL, c)
	require.NoError(t, err)
	isBinaryPatch, err := api.IsBinaryPatch(context.Background(), 4649, "3")
	require.NoError(t, err)
	require.False(t, isBinaryPatch)

	tsBinary := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "application/json")
		_, err := fmt.Fprintln(w, `)]}'
{
  "/COMMIT_MSG": {
    "status": "A",
    "lines_inserted": 15,
    "size_delta": 433,
    "size": 433
  },
  "site/dev/design/Test.png": {
    "status": "A",
    "binary": true,
    "size_delta": 49030,
    "size": 49030
  }
}`)
		require.NoError(t, err)
	}))
	defer tsBinary.Close()
	api, err = NewGerritWithConfig(ConfigChromium, tsBinary.URL, c)
	require.NoError(t, err)
	isBinaryPatch, err = api.IsBinaryPatch(context.Background(), 2370, "5")
	require.NoError(t, err)
	require.True(t, isBinaryPatch)
}

func TestExtractIssueFromCommit(t *testing.T) {
	unittest.SmallTest(t)
	cmtMsg := `
   	Author: John Doe <jdoe@example.com>
		Date:   Mon Feb 5 10:51:20 2018 -0500

    Some change

    Change-Id: I26c4fd0e1414ab2385e8590cd729bc70c66ef37e
    Reviewed-on: https://skia-review.googlesource.com/549319
    Commit-Queue: John Doe <jdoe@example.com>
	`
	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)
	issueID, err := api.ExtractIssueFromCommit(cmtMsg)
	require.NoError(t, err)
	require.Equal(t, int64(549319), issueID)
	_, err = api.ExtractIssueFromCommit("")
	require.Error(t, err)
}

func TestGetCommit(t *testing.T) {
	skipTestIfRequired(t)

	// Fetch the parent for the given issueID and revision.
	issueID := int64(52160)
	revision := "91740d74af689d53b9fa4d172544e0d5620de9bd"
	expectedParent := "aaab3c73575d5502ae345dd71cf8748c2070ffda"

	api, err := NewGerritWithConfig(ConfigChromium, GerritSkiaURL, c)
	require.NoError(t, err)

	commitInfo, err := api.GetCommit(context.Background(), issueID, revision)
	require.NoError(t, err)
	require.Equal(t, expectedParent, commitInfo.Parents[0].Commit)
}

func TestParseChangeId(t *testing.T) {
	unittest.SmallTest(t)

	expect := "Ie00a12db04350ab0f8c754b3674eaa5a0a556b63"
	actual, err := ParseChangeId(`commit 96c2eb6258aef6146d947648db12b6470de8197a (origin/master, origin/HEAD, master)
Author: Eric Boren <borenet@google.com>
Date:   Mon Mar 2 14:53:04 2020 -0500

    [recipes] Move nanobench flags logic into gen_tasks_logic/nanobench_flags.go

    Change-Id: Ie00a12db04350ab0f8c754b3674eaa5a0a556b63
    Reviewed-on: https://skia-review.googlesource.com/c/skia/+/274596
    Commit-Queue: Eric Boren <borenet@google.com>
    Reviewed-by: Ben Wagner aka dogben <benjaminwagner@google.com>
`)
	require.NoError(t, err)
	require.Equal(t, expect, actual)
}

func TestFullChangeId(t *testing.T) {
	unittest.SmallTest(t)

	ci := &ChangeInfo{
		Project:  "skia",
		Branch:   "main",
		ChangeId: "abc",
	}
	require.Equal(t, "skia~main~abc", FullChangeId(ci))

	// Test project with "/" in the name.
	ci.Project = "chromium/src"
	require.Equal(t, "chromium%2Fsrc~main~abc", FullChangeId(ci))

	// Test branch with "/" in the name.
	ci.Branch = "chrome/m90"
	require.Equal(t, "chromium%2Fsrc~chrome%2Fm90~abc", FullChangeId(ci))

	// Test branch with "refs/heads/" prefix.
	ci.Branch = "refs/heads/chrome/m90"
	require.Equal(t, "chromium%2Fsrc~chrome%2Fm90~abc", FullChangeId(ci))
}
