package gerrit

import (
	"context"

	"go.skia.org/infra/go/gerrit"
	"go.skia.org/infra/go/skerr"
	"go.skia.org/infra/go/sklog"
)

const (
	maxGerritSearchResults = 100
)

// FindAllOpenCherrypicks finds all open cherrypicks from the provided
// repo+branch.
func FindAllOpenCherrypicks(ctx context.Context, gerritClient gerrit.GerritInterface, repo, branch string) ([]*gerrit.ChangeInfo, error) {

	// Query gerrit for open changes in the repo+branch combination.
	searchTerms := []*gerrit.SearchTerm{
		gerrit.SearchProject(repo),
		gerrit.SearchBranch(branch),
		gerrit.SearchStatus(gerrit.ChangeStatusOpen),
	}
	changes, err := gerritClient.Search(ctx, maxGerritSearchResults, true, searchTerms...)
	if err != nil {
		return nil, skerr.Wrapf(err, "Could not query gerrit for repo %s and branch %s", repo, branch)
	}
	return changes, nil
}

// IsCherrypickIn returns whether the specified cherrypick exists in the
// provided repo+branch.
func IsCherrypickIn(ctx context.Context, gerritClient gerrit.GerritInterface, repo, branch string, cherrypickChange int) (bool, error) {

	searchTerms := []*gerrit.SearchTerm{
		gerrit.SearchProject(repo),
		gerrit.SearchBranch(branch),
		gerrit.SearchCherrypickOf(cherrypickChange),
	}
	changes, err := gerritClient.Search(ctx, maxGerritSearchResults, true, searchTerms...)
	if err != nil {
		return false, skerr.Wrapf(err, "Could not query gerrit for repo %s and branch %s", repo, branch)
	}
	if len(changes) == 0 {
		return false, nil
	}

	// Log the cherrypicked change numbers. Use for debugging.
	changeNums := []int64{}
	for _, c := range changes {
		changeNums = append(changeNums, c.Issue)
	}
	sklog.Infof("The cherrypick %d was found in changes %+v in %s %s", cherrypickChange, changeNums, repo, branch)

	return true, nil
}

// AddReminderComment adds the specified comment to the provided partial ChangeInfo obj.
func AddReminderComment(ctx context.Context, gerritClient gerrit.GerritInterface, partialChange *gerrit.ChangeInfo, comment string) error {
	// A fully populated ChangeInfo obj is required to add comments.
	ci, err := gerritClient.GetIssueProperties(ctx, partialChange.Issue)
	if err != nil {
		return skerr.Wrapf(err, "Could not get issue properties for %d", partialChange.Issue)
	}
	// Publish the provided comment.
	if err := gerritClient.SetReview(ctx, ci, comment, map[string]int{}, nil, gerrit.NotifyOwner, nil, "", 0, nil); err != nil {
		return skerr.Wrapf(err, "Could not add a comment to %d", ci.Issue)
	}
	return nil
}
