package gerrit

import (
	"context"
	"fmt"
	"testing"

	"github.com/stretchr/testify/require"
	"go.skia.org/infra/docsyserver/go/codereview"
	"go.skia.org/infra/go/gerrit"
	"go.skia.org/infra/go/gerrit/mocks"
	"go.skia.org/infra/go/testutils"
)

var myFakeError = fmt.Errorf("My fake error")

const issue codereview.Issue = "123"
const issueInt64 int64 = 123

func TestGetPatchsetInfo_HappyPath(t *testing.T) {
	const expectedRef = "refs/changes/96/386796/22"
	gc := &mocks.GerritInterface{}
	changeInfo := &gerrit.ChangeInfo{
		Status: gerrit.ChangeStatusNew,
		Patchsets: []*gerrit.Revision{
			{
				Ref: expectedRef,
			},
		},
	}
	gc.On("GetChange", testutils.AnyContext, string(issue)).Return(changeInfo, nil)

	cr := gerritCodeReview{
		gc: gc,
	}
	ref, isClosed, err := cr.GetPatchsetInfo(context.Background(), issue)
	require.NoError(t, err)
	require.False(t, isClosed)
	require.Equal(t, expectedRef, ref)
}

func TestGetPatchsetInfo_GetChangeFails_ReturnsError(t *testing.T) {

	gc := &mocks.GerritInterface{}
	gc.On("GetChange", testutils.AnyContext, string(issue)).Return(nil, myFakeError)

	cr := gerritCodeReview{
		gc: gc,
	}
	_, _, err := cr.GetPatchsetInfo(context.Background(), issue)
	require.Error(t, err)
	require.Contains(t, err.Error(), myFakeError.Error())
}

func TestListModifiedFiles_FilesReturnsError_ReturnsError(t *testing.T) {

	gc := &mocks.GerritInterface{}
	gc.On("Files", testutils.AnyContext, issueInt64, "23").Return(nil, myFakeError)

	cr := gerritCodeReview{
		gc: gc,
	}
	_, err := cr.ListModifiedFiles(context.Background(), issue, "refs/changes/96/386796/23")
	require.Contains(t, err.Error(), myFakeError.Error())
}

func TestListModifiedFiles_MalformedIssue_ReturnsError(t *testing.T) {

	gc := &mocks.GerritInterface{}
	cr := gerritCodeReview{
		gc: gc,
	}
	_, err := cr.ListModifiedFiles(context.Background(), "not a valid issue number", "refs/changes/96/386796/23")
	require.Contains(t, err.Error(), "invalid syntax")
}

func TestListModifiedFiles_FilesReturnsEmptySlice_ReturnsEmptySlice(t *testing.T) {

	gc := &mocks.GerritInterface{}
	response := map[string]*gerrit.FileInfo{}
	gc.On("Files", testutils.AnyContext, issueInt64, "23").Return(response, nil)

	cr := gerritCodeReview{
		gc: gc,
	}
	files, err := cr.ListModifiedFiles(context.Background(), issue, "refs/changes/96/386796/23")
	require.NoError(t, err)
	require.Empty(t, files)
}

func TestListModifiedFiles_FilesReturnsWithCommitMessage_ReturnsEmptySlice(t *testing.T) {

	gc := &mocks.GerritInterface{}
	response := map[string]*gerrit.FileInfo{
		commitMessageFileName: {},
	}
	gc.On("Files", testutils.AnyContext, issueInt64, "23").Return(response, nil)

	cr := gerritCodeReview{
		gc: gc,
	}
	files, err := cr.ListModifiedFiles(context.Background(), issue, "refs/changes/96/386796/23")
	require.NoError(t, err)
	require.Empty(t, files)
}

func TestListModifiedFiles_HappyPath(t *testing.T) {

	gc := &mocks.GerritInterface{}
	response := map[string]*gerrit.FileInfo{
		"site/_index.md": {
			Status: gerrit.FileDeleted,
		},
		"site/users.md": {
			Status: gerrit.FileModified,
		},
		"site/dev.md": {
			Status: gerrit.FileAdded,
		},
	}
	gc.On("Files", testutils.AnyContext, issueInt64, "23").Return(response, nil)

	cr := gerritCodeReview{
		gc: gc,
	}
	files, err := cr.ListModifiedFiles(context.Background(), issue, "refs/changes/96/386796/23")
	require.NoError(t, err)
	expected := []codereview.ListModifiedFilesResult{
		{
			Filename: "site/_index.md",
			Deleted:  true,
		},
		{
			Filename: "site/users.md",
			Deleted:  false,
		},
		{
			Filename: "site/dev.md",
			Deleted:  false,
		},
	}
	require.ElementsMatch(t, expected, files)
}
