package commit_msg

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
	"go.skia.org/infra/autoroll/go/config"
	"go.skia.org/infra/autoroll/go/config_vars"
	"go.skia.org/infra/go/chrome_branch"
	"go.skia.org/infra/go/chrome_branch/mocks"
	"go.skia.org/infra/go/deepequal/assertdeep"
	"go.skia.org/infra/go/testutils"
)

const (
	fakeChildBugLink  = "https://file-a-child-bug.com"
	fakeParentBugLink = "https://file-a-parent-bug.com"
	fakeParentName    = "fake/parent"
)

// fakeCommitMsgConfig returns a valid CommitMsgConfig instance.
func fakeCommitMsgConfig(t *testing.T) *config.CommitMsgConfig {
	c := &config.CommitMsgConfig{
		BugProject:           fakeBugProject,
		ChildLogUrlTmpl:      "https://fake-child-log/{{.RollingFrom}}..{{.RollingTo}}",
		CqExtraTrybots:       []string{"some-trybot-on-m{{.Branches.Chromium.Beta.Milestone}}"},
		CqDoNotCancelTrybots: true,
		ExtraFooters:         []string{"My-Footer: BlahBlah", "My-Other-Footer: Blah"},
		IncludeLog:           true,
		IncludeRevisionCount: true,
		IncludeTbrLine:       true,
		IncludeTests:         true,
		Template: &config.CommitMsgConfig_BuiltIn_{
			BuiltIn: config.CommitMsgConfig_DEFAULT,
		},
	}
	// Sanity check.
	require.NoError(t, c.Validate())
	return c
}

// fakeRegistry returns a config_vars.Registry instance.
func fakeRegistry(t *testing.T) *config_vars.Registry {
	cbc := &mocks.Client{}
	mockBranches := []*chrome_branch.Branch{
		{
			Milestone: 93,
			Number:    4577,
			Ref:       "refs/branch-heads/4577",
			V8Branch:  "9.3",
		},
		{
			Milestone: 92,
			Number:    4515,
			Ref:       "refs/branch-heads/4515",
			V8Branch:  "9.2",
		},
		{
			Milestone: 91,
			Number:    4472,
			Ref:       "refs/branch-heads/4472",
			V8Branch:  "9.1",
		},
	}
	cbc.On("Get", testutils.AnyContext).Return(&chrome_branch.Branches{
		Main:   mockBranches[0],
		Beta:   mockBranches[1],
		Stable: mockBranches[2],
	}, mockBranches, nil)
	reg, err := config_vars.NewRegistry(context.Background(), cbc)
	require.NoError(t, err)
	return reg
}

// fakeBuilder returns a Builder instance.
func fakeBuilder(t *testing.T) *Builder {
	reg := fakeRegistry(t)
	b, err := NewBuilder(fakeCommitMsgConfig(t), reg, fakeChildName, fakeParentName, fakeServerURL, "", "", fakeTransitiveDeps)
	require.NoError(t, err)
	return b
}

func TestMakeVars(t *testing.T) {

	reg := fakeRegistry(t)

	check := func(fn func(*Builder)) {
		c := fakeCommitMsgConfig(t)
		b, err := NewBuilder(c, reg, fakeChildName, fakeParentName, fakeServerURL, fakeChildBugLink, fakeParentBugLink, fakeTransitiveDeps)
		require.NoError(t, err)
		fn(b)
		from, to, revs, reviewers, _ := FakeCommitMsgInputs()
		vars, err := makeVars(c, reg.Vars(), b.childName, b.parentName, b.serverURL, fakeChildBugLink, fakeParentBugLink, b.transitiveDeps, from, to, revs, reviewers)
		require.NoError(t, err)

		// Bugs.
		var expectBugs int
		if c.BugProject == "" {
			expectBugs = 0
		} else if c.BugProject != fakeBugProject {
			expectBugs = 0
		} else {
			expectBugs = 2 // From fakeCommitMsgInputs.
		}
		require.Len(t, vars.Bugs, expectBugs)

		// CqExtratrybots.
		require.Len(t, vars.CqExtraTrybots, 1)
		require.Equal(t, "some-trybot-on-m92", vars.CqExtraTrybots[0])

		// Log URL.
		if c.ChildLogUrlTmpl == "" {
			require.Equal(t, vars.ChildLogURL, "")
		} else {
			require.Equal(t, vars.ChildLogURL, "https://fake-child-log/aaaaaaaaaaaa..cccccccccccc")
		}

		// RollingFrom and RollingTo.
		require.Equal(t, fixupRevision(from), vars.RollingFrom)
		require.Equal(t, fixupRevision(to), vars.RollingTo)

		// Tests.
		if c.IncludeTests {
			require.Len(t, vars.Tests, 1)
		} else {
			require.Len(t, vars.Tests, 0)
		}

		// TransitiveDeps.
		if len(b.transitiveDeps) == 0 {
			require.Len(t, vars.TransitiveDeps, 0)
		} else {
			// Only two of the transitive deps differ.
			require.Len(t, vars.TransitiveDeps, 2)
			assertdeep.Equal(t, &transitiveDepUpdate{
				Dep:         "parent/dep1",
				RollingFrom: "dddddddddddddddddddddddddddddddddddddddd",
				RollingTo:   "eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",
			}, vars.TransitiveDeps[0])
			assertdeep.Equal(t, &transitiveDepUpdate{
				Dep:         "parent/dep3",
				RollingFrom: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
				RollingTo:   "cccccccccccccccccccccccccccccccccccccccc",
			}, vars.TransitiveDeps[1])
		}
	}

	// Default config includes everything.
	check(func(b *Builder) {})
	// No bugs.
	check(func(b *Builder) {
		b.cfg.BugProject = ""
	})
	check(func(b *Builder) {
		b.cfg.BugProject = "bogus project; doesn't match anything"
	})
	// No log URL template.
	check(func(b *Builder) {
		b.cfg.ChildLogUrlTmpl = ""
	})
	// No revisions.
	check(func(b *Builder) {
		b.cfg.IncludeLog = false
	})
	// No tests.
	check(func(b *Builder) {
		b.cfg.IncludeTests = false
	})
	// No transitive deps.
	check(func(b *Builder) {
		b.transitiveDeps = nil
	})
}

func TestNamedTemplatesValid(t *testing.T) {

	cfg := fakeCommitMsgConfig(t)
	for tmpl := range namedCommitMsgTemplates {
		cfg.Template = &config.CommitMsgConfig_BuiltIn_{
			BuiltIn: tmpl,
		}
		require.NoError(t, cfg.Validate())
	}
}

func TestQuotedLines(t *testing.T) {

	c := fakeCommitMsgConfig(t)
	c.Template = &config.CommitMsgConfig_Custom{
		Custom: `{{- define "revisions" -}}
{{ range .Revisions }}{{ .Timestamp.Format "2006-01-02" }} {{ .Author }} {{ .Description }}
{{ quotedLines .Details }}

{{ end }}
{{ end -}}
`,
	}
	reg := fakeRegistry(t)
	b, err := NewBuilder(c, reg, fakeChildName, fakeParentName, fakeServerURL, "", "", fakeTransitiveDeps)
	require.NoError(t, err)

	from, to, revs, reviewers, _ := FakeCommitMsgInputs()
	for _, rev := range revs {
		rev.Details += `

Change-Id: If3fd7d9b2ec5aaf7f048df1029b732b28378999d
`
	}

	msg, err := b.Build(from, to, revs, reviewers, false)
	require.NoError(t, err)
	require.Equal(t, `Roll fake/child/src from aaaaaaaaaaaa to cccccccccccc (2 revisions)

2020-04-17 c@google.com Commit C
> blah blah
> 
> ccccccc
> 
> blah
> 
> Change-Id: If3fd7d9b2ec5aaf7f048df1029b732b28378999d
> 

2020-04-16 b@google.com Commit B
> blah blah
> 
> bbbbbbb
> 
> blah
> 
> Change-Id: If3fd7d9b2ec5aaf7f048df1029b732b28378999d
> 

If this roll has caused a breakage, revert this CL and stop the roller
using the controls here:
https://fake.server.com/r/fake-autoroll
Please CC reviewer@google.com on the revert to ensure that a human
is aware of the problem.

To report a problem with the AutoRoller itself, please file a bug:
https://bugs.chromium.org/p/skia/issues/entry?template=Autoroller+Bug

Documentation for the AutoRoller is here:
https://skia.googlesource.com/buildbot/+doc/main/autoroll/README.md

Cq-Include-Trybots: some-trybot-on-m92
Cq-Do-Not-Cancel-Tryjobs: true
Bug: fakebugproject:1234,fakebugproject:5678
Tbr: reviewer@google.com
Test: some-test
My-Footer: BlahBlah
My-Other-Footer: Blah
`, msg)
}
