// Copyright 2016 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package godash

import (
	"strings"

	"github.com/google/go-github/github"
	"golang.org/x/net/context"
)

// LoadGithub fetches the list of reviewers for the current
// repository, sorted by how many reviews each has done.
func (r *Reviewers) LoadGithub(ctx context.Context, client *github.Client) error {
	// TODO(quentin): GitHub has an API for fetching the list of
	// authors ordered by # of commits... is this sufficient
	// instead of walking the whole commit list?
	lastTime, lastSHA := r.data.LastTime, r.data.LastSHA
pages:
	for page := 1; ; {
		opt := github.CommitsListOptions{
			SHA: "master",
			ListOptions: github.ListOptions{
				Page:    page,
				PerPage: 100,
			},
		}
		commits, resp, err := client.Repositories.ListCommits(ctx, projectOwner, projectRepo, &opt)
		for _, commit := range commits {
			if commit.Commit != nil && commit.Commit.Committer != nil && commit.Commit.Committer.Date != nil && commit.SHA != nil {
				if commit.Commit.Committer.Date.After(r.data.LastTime) {
					r.data.LastTime = *commit.Commit.Committer.Date
					r.data.LastSHA = *commit.SHA
				}
				if commit.Commit.Committer.Date.Before(lastTime) || *commit.SHA == lastSHA {
					break pages
				}
			}
			if commit.Commit != nil && commit.Commit.Author != nil && commit.Commit.Author.Email != nil {
				r.add(*commit.Commit.Author.Email, false)
				if commit.Author != nil && commit.Author.Login != nil {
					r.data.GitHubByAddr[*commit.Commit.Author.Email] = *commit.Author.Login
				}
			}
			if commit.Commit != nil && commit.Commit.Message != nil {
				for _, line := range strings.Split(string(*commit.Commit.Message), "\n") {
					if strings.HasPrefix(line, "Reviewed-by:") {
						f := strings.Fields(line)
						addr := f[len(f)-1]
						if strings.HasPrefix(addr, "<") && strings.HasSuffix(addr, ">") {
							addr = addr[1 : len(addr)-1]
						}
						r.add(addr, true)
					}
				}
			}
		}
		if err != nil {
			return err
		}
		if resp.NextPage < page {
			break
		}
		page = resp.NextPage
	}
	r.recalculate()
	return nil
}
