// Package data_bug_revert supplies test data that matches the following scenario:
// There are two tests run by each of four devices. On the second commit,
// a developer introduces a bug, causing both tests to start drawing
// untriaged images. Then, on the fourth commit, the bug was reverted,
// restoring the expected images.
package data_bug_revert

import (
	"time"

	"go.skia.org/infra/golden/go/expectations"
	"go.skia.org/infra/golden/go/tiling"
	"go.skia.org/infra/golden/go/types"
)

const (
	// These digests are valid, but arbitrary
	AlfaPositiveDigest     = types.Digest("aaa0ddfc45a95372747804fc75061fc1")
	CharliePositiveDigest  = types.Digest("ccc609f89667947852479995dc3b625e")
	EchoPositiveDigest     = types.Digest("eeec3fc301ef00a9c193f9c5abd664ba")
	BravoUntriagedDigest   = types.Digest("bbbaac428fc2fc1f4dd3707031a6dc6d")
	DeltaUntriagedDigest   = types.Digest("ddd3199bda4b909d3ba2ab14120998cd")
	FoxtrotUntriagedDigest = types.Digest("fff13007fba3a6edd4d600eb891286ca")
	// Less typing below
	missingDigest = tiling.MissingDigest

	TestOne = types.TestName("test_one")
	TestTwo = types.TestName("test_two")

	AlphaDevice = "alpha"
	BetaDevice  = "beta"
	GammaDevice = "gamma"
	DeltaDevice = "delta"

	InnocentAuthor = "innocent@example.com"
	BuggyAuthor    = "buggy@example.com"

	FirstCommitHash  = "111118b693f2fc53501ac341f3029860b3b57a10"
	SecondCommitHash = "222223f867b38dfa488c57030af3663bcaae3736"
	ThirdCommitHash  = "333332b919fab5ca878757fff4766cc12936f82c"
	FourthCommitHash = "44444001b3cd9e81d4d67bbaf8816e00b29a7dd4"
	FifthCommitHash  = "55555418769962eddd02c36d52f3ab3b775f926a"

	BugIntroducedCommitIndex = 2
	RevertBugCommitIndex     = 4
)

func MakeTestCommits() []tiling.Commit {
	// Five commits, with completely arbitrary data
	return []tiling.Commit{
		{
			Hash:       FirstCommitHash,
			CommitTime: time.Date(2019, time.May, 26, 12, 0, 3, 0, time.UTC),
			Author:     InnocentAuthor,
			Subject:    "Just an ordinary commit",
		},
		{
			Hash:       SecondCommitHash,
			CommitTime: time.Date(2019, time.May, 26, 12, 10, 18, 0, time.UTC),
			Author:     BuggyAuthor,
			Subject:    "I hope this doesn't have a bug",
		},
		{
			Hash:       ThirdCommitHash,
			CommitTime: time.Date(2019, time.May, 26, 13, 10, 8, 0, time.UTC),
			Author:     InnocentAuthor,
			Subject:    "whitespace change",
		},
		{
			Hash:       FourthCommitHash,
			CommitTime: time.Date(2019, time.May, 26, 13, 15, 28, 0, time.UTC),
			Author:     BuggyAuthor,
			Subject:    "revert 'I hope this doesn't have a bug'",
		},
		{
			Hash:       FifthCommitHash,
			CommitTime: time.Date(2019, time.May, 26, 13, 35, 38, 0, time.UTC),
			Author:     InnocentAuthor,
			Subject:    "documentation change",
		},
	}
}

func MakeTestTile() *tiling.Tile {
	return &tiling.Tile{
		Commits: MakeTestCommits(),
		Traces: map[tiling.TraceID]*tiling.Trace{
			",device=alpha,name=test_one,source_type=gm,": tiling.NewTrace(
				types.DigestSlice{
					// A very clear history showing 2nd commit as the change to bravo
					// The next three traces are the same data, just with various bits missing.
					AlfaPositiveDigest, BravoUntriagedDigest, BravoUntriagedDigest, AlfaPositiveDigest, AlfaPositiveDigest,
				},
				map[string]string{
					"device":              AlphaDevice,
					types.PrimaryKeyField: string(TestOne),
					types.CorpusField:     "gm",
				},
			),
			",device=beta,name=test_one,source_type=gm,": tiling.NewTrace(
				types.DigestSlice{
					AlfaPositiveDigest, missingDigest, BravoUntriagedDigest, missingDigest, AlfaPositiveDigest,
				},
				map[string]string{
					"device":              BetaDevice,
					types.PrimaryKeyField: string(TestOne),
					types.CorpusField:     "gm",
				},
			),
			",device=gamma,name=test_one,source_type=gm,": tiling.NewTrace(
				types.DigestSlice{
					AlfaPositiveDigest, BravoUntriagedDigest, missingDigest, missingDigest, AlfaPositiveDigest,
				},
				map[string]string{
					"device":              GammaDevice,
					types.PrimaryKeyField: string(TestOne),
					types.CorpusField:     "gm",
				},
			),
			",device=delta,name=test_one,source_type=gm,": tiling.NewTrace(
				types.DigestSlice{
					missingDigest, BravoUntriagedDigest, missingDigest, missingDigest, AlfaPositiveDigest,
				},
				map[string]string{
					"device":              DeltaDevice,
					types.PrimaryKeyField: string(TestOne),
					types.CorpusField:     "gm",
				},
			),

			",device=alpha,name=test_two,source_type=gm,": tiling.NewTrace(
				types.DigestSlice{
					// A very clear history showing 2nd commit as the change to bravo
					// The next trace is the same data, just with various bits missing.
					CharliePositiveDigest, DeltaUntriagedDigest, DeltaUntriagedDigest, CharliePositiveDigest, CharliePositiveDigest,
				},
				map[string]string{
					"device":              AlphaDevice,
					types.PrimaryKeyField: string(TestTwo),
					types.CorpusField:     "gm",
				},
			),
			",device=beta,name=test_two,source_type=gm,": tiling.NewTrace(
				types.DigestSlice{
					CharliePositiveDigest, missingDigest, missingDigest, missingDigest, CharliePositiveDigest,
				},
				map[string]string{
					"device":              BetaDevice,
					types.PrimaryKeyField: string(TestTwo),
					types.CorpusField:     "gm",
				},
			),
			",device=gamma,name=test_two,source_type=gm,": tiling.NewTrace(
				types.DigestSlice{
					// A somewhat flaky trace, using multiple positive/untriaged digests.
					CharliePositiveDigest, DeltaUntriagedDigest, FoxtrotUntriagedDigest, missingDigest, EchoPositiveDigest,
				},
				map[string]string{
					"device":              GammaDevice,
					types.PrimaryKeyField: string(TestTwo),
					types.CorpusField:     "gm",
				},
			),
			",device=delta,name=test_two,source_type=gm,": tiling.NewTrace(
				types.DigestSlice{
					// Here's an interesting case where the culprit isn't accurately identified
					// due to missing data. Here, both the authors of the 2nd and 3rd commit
					// are possibly to blame.
					EchoPositiveDigest, missingDigest, FoxtrotUntriagedDigest, missingDigest, missingDigest,
				},
				map[string]string{
					"device":              DeltaDevice,
					types.PrimaryKeyField: string(TestTwo),
					types.CorpusField:     "gm",
				},
			),
		},

		// Summarizes all the keys and values seen in this tile
		// The values should be in alphabetical order (see paramset.Normalize())
		ParamSet: map[string][]string{
			"device":              {AlphaDevice, BetaDevice, GammaDevice, DeltaDevice},
			types.PrimaryKeyField: {string(TestOne), string(TestTwo)},
			types.CorpusField:     {"gm"},
		},
	}
}

func MakeTestExpectations() *expectations.Expectations {
	var e expectations.Expectations
	e.Set(TestOne, AlfaPositiveDigest, expectations.Positive)
	e.Set(TestTwo, CharliePositiveDigest, expectations.Positive)
	e.Set(TestTwo, EchoPositiveDigest, expectations.Positive)
	return &e
}
