package cid

import (
	"io/ioutil"
	"path/filepath"
	"strings"
	"testing"
	"time"

	"go.skia.org/infra/go/git/gitinfo"
	"go.skia.org/infra/go/ingestion"
	"go.skia.org/infra/go/mockhttpclient"
	"go.skia.org/infra/go/rietveld"
	"go.skia.org/infra/go/testutils"
	"go.skia.org/infra/go/util"
	"go.skia.org/infra/go/vcsinfo"

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

var (
	// TEST_COMMITS are the commits we are considering. It needs to contain at
	// least all the commits referenced in the test file.
	TEST_COMMITS = []*vcsinfo.LongCommit{
		{
			ShortCommit: &vcsinfo.ShortCommit{
				Hash:    "fe4a4029a080bc955e9588d05a6cd9eb490845d4",
				Subject: "Really big code change",
			},
			Timestamp: time.Now().Add(-time.Second * 10).Round(time.Second),
			Branches:  map[string]bool{"master": true},
		},
	}
)

func TestCommitID(t *testing.T) {
	testutils.SmallTest(t)
	c := &CommitID{
		Offset: 51,
		Source: "master",
	}
	assert.Equal(t, "master-000001.bdb", c.Filename())
	assert.Equal(t, "master-000051", c.ID())

	c = &CommitID{
		Offset: 0,
		Source: "https://codereview.chromium.org/2251213006",
	}
	assert.Equal(t, "https___codereview_chromium_org_2251213006-000000.bdb", c.Filename())
	assert.Equal(t, "https___codereview_chromium_org_2251213006-000000", c.ID())
}

func TestFromIssue(t *testing.T) {
	testutils.SmallTest(t)
	b, err := ioutil.ReadFile(filepath.Join("testdata", "rietveld_response.txt"))
	assert.NoError(t, err)
	m := mockhttpclient.NewURLMock()
	m.Mock("https://codereview.chromium.org/api/1467533002", mockhttpclient.MockGetDialogue(b))
	m.Mock("https://chromium-cq-status.appspot.com/v2/patch-summary/codereview.chromium.org/2320153002/840001", mockhttpclient.MockGetDialogue([]byte("{}")))

	review := rietveld.New("https://codereview.chromium.org", m.Client())
	commitID, err := FromIssue(review, "1467533002", "40001")
	assert.NoError(t, err)

	expected := &CommitID{
		Source: "https://codereview.chromium.org/1467533002",
		Offset: 2,
	}
	assert.Equal(t, expected, commitID)

	commitID, err = FromIssue(review, "999999999", "40001")
	assert.Error(t, err)
	assert.Nil(t, commitID)
}

func TestFromHash(t *testing.T) {
	testutils.SmallTest(t)
	vcs := ingestion.MockVCS(TEST_COMMITS)
	commitID, err := FromHash(vcs, "fe4a4029a080bc955e9588d05a6cd9eb490845d4")
	assert.NoError(t, err)

	expected := &CommitID{
		Source: "master",
		Offset: 0,
	}
	assert.Equal(t, expected, commitID)

	commitID, err = FromHash(vcs, "not-a-valid-hash")
	assert.Error(t, err)
	assert.Nil(t, commitID)
}

func TestLookup(t *testing.T) {
	testutils.SmallTest(t)
	b, err := ioutil.ReadFile(filepath.Join("testdata", "rietveld_response.txt"))
	assert.NoError(t, err)
	m := mockhttpclient.NewURLMock()
	m.Mock("https://codereview.chromium.org/api/1467533002", mockhttpclient.MockGetDialogue(b))

	b, err = ioutil.ReadFile(filepath.Join("testdata", "rietveld_patchset_response.txt"))
	assert.NoError(t, err)
	m.Mock("https://codereview.chromium.org/api/1467533002/40001", mockhttpclient.MockGetDialogue(b))
	m.Mock("https://chromium-cq-status.appspot.com/v2/patch-summary/codereview.chromium.org/2320153002/840001", mockhttpclient.MockGetDialogue([]byte("{}")))

	review := rietveld.New("https://codereview.chromium.org", m.Client())

	tr := util.NewTempRepo()
	defer tr.Cleanup()

	git, err := gitinfo.NewGitInfo(filepath.Join(tr.Dir, "testrepo"), false, false)
	if err != nil {
		t.Fatal(err)
	}
	lookup := New(git, review, "https://skia.googlesource.com/skia")
	assert.NotNil(t, lookup)

	cids := []*CommitID{
		{
			Source: "master",
			Offset: 1,
		},
		{
			Source: "https://codereview.chromium.org/1467533002",
			Offset: 2,
		},
	}

	details, err := lookup.Lookup(cids)
	assert.NoError(t, err)
	assert.Equal(t, 2, len(details))

	expectedDetails := []*CommitDetail{
		{
			CommitID: CommitID{
				Offset: 1,
				Source: "master",
			},
			Author:    "Joe Gregorio (jcgregorio@google.com)",
			Message:   "ab8d7b6 -  2y 15w - Test Commit 1",
			URL:       "https://skia.googlesource.com/skia/+/ab8d7b6872097732a27c459bb226683cdb4695bd",
			Hash:      "ab8d7b6872097732a27c459bb226683cdb4695bd",
			Timestamp: 1407642093,
		},
		{
			CommitID: CommitID{
				Offset: 2,
				Source: "https://codereview.chromium.org/1467533002",
			},
			Author:    "mtklein_C",
			Message:   "Iss: 1467533002 Patch: 40001 - GN: Android perf/tests Committed: foo.  ",
			URL:       "https://codereview.chromium.org/1467533002",
			Hash:      "",
			Timestamp: 1448988012,
		},
	}
	// Message will change based on the passage of time. Test what we can, then
	// copy the actual Message into the expected Message.
	assert.True(t, strings.HasPrefix(details[0].Message, "ab8d7b6 -"))
	assert.True(t, strings.HasSuffix(details[0].Message, " - Test Commit 1"))
	expectedDetails[0].Message = details[0].Message

	assert.Equal(t, expectedDetails, details)

	cids[0].Offset = -1
	details, err = lookup.Lookup(cids)
	assert.Error(t, err)
}

func TestParseLogLine(t *testing.T) {
	testutils.SmallTest(t)
	s := "1476870603 e8f0a7b986f1e5583c9bc162efcdd92fd6430549 joel.liang@arm.com Generate Signed Distance Field directly from vector path"
	var index int = 3
	entry, err := parseLogLine(s, &index, nil)
	assert.NoError(t, err)
	expected := &cacheEntry{
		author:  "joel.liang@arm.com",
		subject: "Generate Signed Distance Field directly from vector path",
		hash:    "e8f0a7b986f1e5583c9bc162efcdd92fd6430549",
		ts:      1476870603,
	}
	assert.Equal(t, expected, entry)
	assert.Equal(t, 4, index)

	// No subject.
	s = "1476870603 e8f0a7b986f1e5583c9bc162efcdd92fd6430549 joel.liang@arm.com"
	entry, err = parseLogLine(s, &index, nil)
	assert.Error(t, err)
	assert.Contains(t, err.Error(), "Failed to parse parts")
	assert.Equal(t, 4, index)

	// Invalid timestamp.
	s = "1476870ZZZ e8f0a7b986f1e5583c9bc162efcdd92fd6430549 joel.liang@arm.com Generate Signed Distance Field directly from vector path"
	entry, err = parseLogLine(s, &index, nil)
	assert.Error(t, err)
	assert.Contains(t, err.Error(), "Can't parse timestamp")
	assert.Equal(t, 4, index)
}

func TestFromID(t *testing.T) {
	testutils.SmallTest(t)
	testCases := []struct {
		value    string
		expected *CommitID
		err      bool
		message  string
	}{
		{
			value: "master-000051",
			expected: &CommitID{
				Offset: 51,
				Source: "master",
			},
			err:     false,
			message: "Simple",
		},
		{
			value:    "some_trybot-000051",
			expected: nil,
			err:      true,
			message:  "TryBot should fail",
		},
		{
			value:    "master-notanint",
			expected: nil,
			err:      true,
			message:  "Fail parse int",
		},
		{
			value:    "invalid",
			expected: nil,
			err:      true,
			message:  "no dashes",
		},
		{
			value:    "in-val-id",
			expected: nil,
			err:      true,
			message:  "too many dashes",
		},
	}

	for _, tc := range testCases {
		got, err := FromID(tc.value)
		assert.Equal(t, tc.err, err != nil, tc.message)
		assert.Equal(t, tc.expected, got, tc.message)
	}

}
