package incremental

import (
	"context"
	"fmt"
	"reflect"
	"sync"

	"go.skia.org/infra/go/git"
	"go.skia.org/infra/go/git/repograph"
	"go.skia.org/infra/go/metrics2"
	"go.skia.org/infra/go/vcsinfo"
	"go.skia.org/infra/task_scheduler/go/window"
)

// commitsCache is a struct used for tracking newly-landed commits.
type commitsCache struct {
	mtx sync.Mutex
	// map[repo URL][branch name]*git.Branch
	oldBranchHeads map[string]map[string]*git.Branch
	repos          repograph.Map
}

// newCommitsCache returns a commitsCache instance.
func newCommitsCache(repos repograph.Map) *commitsCache {
	return &commitsCache{
		repos: repos,
	}
}

// Return any new commits for each repo, or the last N if reset is true. Branch
// heads will be provided for a given repo only if there are new commits for
// that repo, or if reset is true. The returned commits may be in any order and
// are not sorted by timestamp.
func (c *commitsCache) Update(ctx context.Context, w *window.Window, reset bool, n int) (map[string][]*git.Branch, map[string][]*vcsinfo.LongCommit, error) {
	defer metrics2.FuncTimer().Stop()
	c.mtx.Lock()
	defer c.mtx.Unlock()

	newCommitsAllRepos, err := c.repos.UpdateAndReturnNewCommits(ctx)
	if err != nil {
		return nil, nil, fmt.Errorf("Failed to update commitsCache; failed to update repos: %s", err)
	}
	updatedBranchHeads := make(map[string]map[string]*git.Branch, len(c.repos))
	rvCommits := make(map[string][]*vcsinfo.LongCommit, len(c.repos))
	rvBranchHeads := make(map[string][]*git.Branch, len(c.repos))
	for repoUrl, repo := range c.repos {
		// Update the branch heads for this repo.
		bh := repo.BranchHeads()
		bhMap := make(map[string]*git.Branch, len(bh))
		for _, h := range bh {
			bhMap[h.Name] = h
		}
		updatedBranchHeads[repoUrl] = bhMap

		newCommits := newCommitsAllRepos[repoUrl]

		// If reset is specified, we don't care about changes; we return
		// all commits in range.
		if reset {
			var err error
			newCommits, err = repo.GetLastNCommits(n)
			if err != nil {
				return nil, nil, fmt.Errorf("Failed to update commitsCache; failed to obtain commits from %s: %s", repoUrl, err)
			}
		}
		// Add any new commits to the return value. The branch heads get
		// updated if there are any new commits OR if the branch heads
		// have changed (eg. in the case of a reset or empty merge).
		if reset || len(newCommits) > 0 {
			rvCommits[repoUrl] = newCommits
			rvBranchHeads[repoUrl] = bh
		} else if !reflect.DeepEqual(c.oldBranchHeads[repoUrl], bhMap) {
			rvBranchHeads[repoUrl] = bh
		}
	}
	c.oldBranchHeads = updatedBranchHeads
	return rvBranchHeads, rvCommits, nil
}
