package cid

import (
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	"go.skia.org/infra/go/testutils/unittest"
	"go.skia.org/infra/perf/go/config"
	perfgit "go.skia.org/infra/perf/go/git"
	"go.skia.org/infra/perf/go/git/gittest"
)

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

func TestCommitDetailID_Success(t *testing.T) {
	unittest.SmallTest(t)
	c := &CommitDetail{
		Offset: 51,
	}
	assert.Equal(t, "master-000051", c.ID())
}

func TestFromID(t *testing.T) {
	unittest.SmallTest(t)
	testCases := []struct {
		value    string
		expected *CommitID
		err      bool
		message  string
	}{
		{
			value: "master-000051",
			expected: &CommitID{
				Offset: 51,
			},
			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)
	}

}

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

	config.Config = &config.InstanceConfig{
		GitRepoConfig: config.GitRepoConfig{},
	}

	want := "https://some-repo.example.org/+show/db4eaa1d0783df0fd4b630ac897c5cbc3c387d10"
	got := urlFromParts("https://some-repo.example.org", "db4eaa1d0783df0fd4b630ac897c5cbc3c387d10",
		"https://some-bounce-url.example.org", false)
	assert.Equal(t, want, got)
}

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

	config.Config = &config.InstanceConfig{
		GitRepoConfig: config.GitRepoConfig{
			CommitURL: "%s/commit/%s",
		},
	}

	want := "https://some-repo.example.org/commit/db4eaa1d0783df0fd4b630ac897c5cbc3c387d10"
	got := urlFromParts("https://some-repo.example.org", "db4eaa1d0783df0fd4b630ac897c5cbc3c387d10",
		"https://some-bounce-url.example.org", false)
	assert.Equal(t, want, got)
}

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

	config.Config = &config.InstanceConfig{
		GitRepoConfig: config.GitRepoConfig{},
	}

	want := "https://some-bounce-url.example.org"
	got := urlFromParts("https://skia.googlesource.com/perf-buildid/android-master", "db4eaa1d0783df0fd4b630ac897c5cbc3c387d10",
		"https://some-bounce-url.example.org", true)
	assert.Equal(t, want, got)
}

func TestCommitIDLookup_Success(t *testing.T) {
	unittest.LargeTest(t)
	ctx, db, _, hashes, instanceConfig, _, cleanup := gittest.NewForTest(t)
	defer cleanup()
	g, err := perfgit.New(ctx, true, db, instanceConfig)
	require.NoError(t, err)
	config.Config = instanceConfig
	commitIdLookup := New(ctx, g, instanceConfig)

	details, err := commitIdLookup.Lookup(ctx, []*CommitID{
		{Offset: 0},
		{Offset: 2},
		{Offset: 5},
	})
	require.NoError(t, err)
	assert.Equal(t, hashes[0], details[0].Hash)
	assert.Equal(t, hashes[2], details[1].Hash)
	assert.Equal(t, hashes[5], details[2].Hash)

	// Message contains info relative to the current time, so we'll test it
	// individually.
	assert.Contains(t, details[0].Message, hashes[0][:7])

	// URL contains info relative to the tmp dir used to create the test git
	// repo, so we'll test it individuall.
	assert.Contains(t, details[0].URL, hashes[0][:7])

	// Then clear it to test the rest of the struct.
	details[0].Message = ""
	details[0].URL = ""
	assert.Equal(t, &CommitDetail{
		Offset:    0,
		Author:    "test <test@google.com>",
		Message:   "",
		URL:       "",
		Hash:      hashes[0],
		Timestamp: gittest.StartTime.Unix(),
	}, details[0])
}

func TestCommitIDLookup_ErrOnBadCommit(t *testing.T) {
	unittest.LargeTest(t)
	ctx, db, _, _, instanceConfig, _, cleanup := gittest.NewForTest(t)
	defer cleanup()
	g, err := perfgit.New(ctx, true, db, instanceConfig)
	require.NoError(t, err)
	commitIdLookup := New(ctx, g, instanceConfig)

	_, err = commitIdLookup.Lookup(ctx, []*CommitID{
		{Offset: -1},
	})
	require.Error(t, err)
}
