// 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 generates dashboards about issues and CLs in the Go
// Github and Gerrit projects. There is a user-friendly interface in
// the godash command-line tool at golang.org/x/build/cmd/godash
package godash

import (
	"bytes"
	"fmt"
	"io"
	"regexp"
	"sort"
	"strconv"
	"strings"
	"time"

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

type Issue struct {
	Number                   int
	Title                    string
	Labels                   []string
	Reporter                 string
	Assignee                 string
	Milestone                string
	State                    string
	Created, Updated, Closed time.Time
}

type Group struct {
	Dir   string
	Items []*Item
}

type Item struct {
	Issue *Issue
	CLs   []*CL
}

// Data represents all the data needed to compute the dashboard
type Data struct {
	Issues     map[int]*Issue
	CLs        []*CL
	Milestones []*github.Milestone
	// GoReleaseCycle is the minor version of the current
	// under-development Go release. Issues and CLs for versions
	// greater than the current Go release will be hidden.
	GoReleaseCycle int
	Now            time.Time

	Reviewers *Reviewers
}

var (
	releaseRE = regexp.MustCompile(`^Go1\.(\d+)$`)
)

func (d *Data) FetchData(ctx context.Context, gh *github.Client, ger *gerrit.Client, log func(string, ...interface{}), days int, clOnly, includeMerged bool) error {
	d.Now = time.Now()
	start := time.Now()
	m, err := getMilestones(gh)
	if err != nil {
		return err
	}
	d.Milestones = m

	// Find the lowest-numbered open release milestone. We assume
	// that is the currently-in-development release, and anything
	// later should be hidden.
	d.GoReleaseCycle = 0
	for _, m := range d.Milestones {
		if matches := releaseRE.FindStringSubmatch(*m.Title); matches != nil {
			n, _ := strconv.Atoi(matches[1])
			if d.GoReleaseCycle == 0 || d.GoReleaseCycle > n {
				d.GoReleaseCycle = n
			}
		}
	}
	since := d.Now.Add(-(time.Duration(days)*24 + 12) * time.Hour).UTC().Round(time.Second)
	cls, err := fetchCLs(ctx, ger, d.Reviewers, d.GoReleaseCycle, "is:open")
	if err != nil {
		return err
	}
	log("Fetched %d open CLs in %.3f seconds", len(cls), time.Since(start).Seconds())
	start = time.Now()

	var open []*CL
	for _, cl := range cls {
		if !cl.Closed && (clOnly || !strings.HasPrefix(cl.Subject, "[dev.")) {
			open = append(open, cl)
		}
	}
	if includeMerged {
		cls, err := fetchCLs(ctx, ger, d.Reviewers, d.GoReleaseCycle, "is:merged since:\""+since.Format("2006-01-02 15:04:05")+"\"")
		if err != nil {
			return err
		}
		log("Fetched %d merged CLs in %.3f seconds", len(cls), time.Since(start).Seconds())
		start = time.Now()
		open = append(open, cls...)
	}
	d.CLs = open

	d.Issues = make(map[int]*Issue)

	if !clOnly {
		res, err := listIssues(gh, github.IssueListByRepoOptions{State: "open"})
		if err != nil {
			return err
		}
		log("Fetched %d open issues in %.3f seconds", len(res), time.Since(start).Seconds())
		start = time.Now()
		res2, err := searchIssues(gh, "is:closed closed:>="+since.Format(time.RFC3339))
		if err != nil {
			return err
		}
		log("Fetched %d closed issues in %.3f seconds", len(res2), time.Since(start).Seconds())
		res = append(res, res2...)
		for _, issue := range res {
			d.Issues[issue.Number] = issue
		}
	}
	return nil
}

// GroupData returns information about all the issues and CLs,
// grouping related issues and CLs together and then grouping those
// items by directory affected. includeIssues specifies whether to
// include both CLs and issues or just CLs. allCLs specifies whether
// to include CLs from non-go projects (i.e. x/ repos).
func (d *Data) GroupData(includeIssues, allCLs bool) []*Group {
	groupsByDir := make(map[string]*Group)
	addGroup := func(item *Item) {
		dir := item.Dir()
		g := groupsByDir[dirKey(dir)]
		if g == nil {
			g = &Group{Dir: dir}
			groupsByDir[dirKey(dir)] = g
		}
		g.Items = append(g.Items, item)
	}
	itemsByBug := map[int]*Item{}

	if includeIssues {
		for _, issue := range d.Issues {
			item := &Item{Issue: issue}
			addGroup(item)
			itemsByBug[issue.Number] = item
		}
	}

	for _, cl := range d.CLs {
		found := false
		for _, id := range cl.Issues {
			item := itemsByBug[id]
			if item != nil {
				found = true
				item.CLs = append(item.CLs, cl)
			}
		}
		if !found {
			if cl.Project == "go" || allCLs {
				item := &Item{CLs: []*CL{cl}}
				addGroup(item)
			}
		}
	}

	var keys []string
	for key, g := range groupsByDir {
		sort.Sort(itemsBySummary(g.Items))
		keys = append(keys, key)
	}
	sort.Strings(keys)
	var groups []*Group
	for _, key := range keys {
		g := groupsByDir[key]
		groups = append(groups, g)
	}
	return groups
}

var okDesc = map[string]bool{
	"all":   true,
	"build": true,
}

func (item *Item) Dir() string {
	for _, cl := range item.CLs {
		if cl.Status == "merged" {
			return "closed"
		}
		dirs := cl.Dirs()
		desc := titleDir(cl.Subject)

		// Accept description if it is a global prefix like "all".
		if okDesc[desc] {
			return desc
		}

		// Accept description if it matches one of the directories.
		for _, dir := range dirs {
			if dir == desc {
				return dir
			}
		}

		// Otherwise use most common directory.
		if len(dirs) > 0 {
			return dirs[0]
		}

		// Otherwise accept description.
		return desc
	}
	if item.Issue != nil {
		if item.Issue.State == "closed" {
			return "closed"
		}
		if hasLabel(item.Issue, "Proposal") {
			return "proposal"
		}
		if dir := titleDir(item.Issue.Title); dir != "" {
			return dir
		}
		return "?"
	}
	return "?"
}

func hasLabel(issue *Issue, label string) bool {
	for _, lab := range issue.Labels {
		if label == lab {
			return true
		}
	}
	return false
}

func titleDir(title string) string {
	if i := strings.Index(title, "\n"); i >= 0 {
		title = title[:i]
	}
	title = strings.TrimSpace(title)
	i := strings.Index(title, ":")
	if i < 0 {
		return ""
	}
	title = title[:i]
	if i := strings.Index(title, ","); i >= 0 {
		title = strings.TrimSpace(title[:i])
	}
	if strings.Contains(title, " ") {
		return ""
	}
	return title
}

// Dirs returns the list of directories that this CL might be said to be about,
// in preference order.
func (cl *CL) Dirs() []string {
	prefix := ""
	if cl.Project != "go" {
		prefix = "x/" + cl.Project + "/"
	}
	counts := map[string]int{}
	for _, file := range cl.Files {
		name := file
		i := strings.LastIndex(name, "/")
		if i >= 0 {
			name = name[:i]
		} else {
			name = ""
		}
		name = strings.TrimPrefix(name, "src/")
		if name == "src" {
			name = ""
		}
		name = prefix + name
		if name == "" {
			name = "build"
		}
		counts[name]++
	}

	if _, ok := counts["test"]; ok {
		counts["test"] -= 10000 // do not pick as most frequent
	}

	var dirs dirCounts
	for name, count := range counts {
		dirs = append(dirs, dirCount{name, count})
	}
	sort.Sort(dirs)

	var names []string
	for _, d := range dirs {
		names = append(names, d.name)
	}
	return names
}

type dirCount struct {
	name  string
	count int
}

type dirCounts []dirCount

func (x dirCounts) Len() int      { return len(x) }
func (x dirCounts) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
func (x dirCounts) Less(i, j int) bool {
	if x[i].count != x[j].count {
		return x[i].count > x[j].count
	}
	return x[i].name < x[j].name
}

type itemsBySummary []*Item

func (x itemsBySummary) Len() int           { return len(x) }
func (x itemsBySummary) Swap(i, j int)      { x[i], x[j] = x[j], x[i] }
func (x itemsBySummary) Less(i, j int) bool { return itemSummary(x[i]) < itemSummary(x[j]) }

func itemSummary(it *Item) string {
	if it.Issue != nil {
		return it.Issue.Title
	}
	for _, cl := range it.CLs {
		return cl.Subject
	}
	return ""
}

func dirKey(s string) string {
	if strings.Contains(s, ".") {
		return "\x7F" + s
	}
	return s
}

var milestoneRE = regexp.MustCompile(`^Go1\.(\d+)(|\.(\d+))(|[A-Z].*)$`)

type milestone struct {
	title        string
	major, minor int
	due          time.Time
}

func (d *Data) GetActiveMilestones() []string {
	var all []milestone
	for _, dm := range d.Milestones {
		if m := milestoneRE.FindStringSubmatch(*dm.Title); m != nil {
			major, _ := strconv.Atoi(m[1])
			minor, _ := strconv.Atoi(m[3])
			if major <= d.GoReleaseCycle {
				all = append(all, milestone{*dm.Title, major, minor, getTime(dm.DueOn)})
			}
		}
	}
	sort.Sort(milestones(all))
	var titles []string
	for _, m := range all {
		titles = append(titles, m.title)
	}
	return titles
}

type milestones []milestone

func (x milestones) Len() int      { return len(x) }
func (x milestones) Swap(i, j int) { x[i], x[j] = x[j], x[i] }
func (x milestones) Less(i, j int) bool {
	a, b := x[i], x[j]
	if a.major != b.major {
		return a.major < b.major
	}
	if a.minor != b.minor {
		return a.minor < b.minor
	}
	if !a.due.Equal(b.due) {
		return a.due.Before(b.due)
	}
	return a.title < b.title
}

type section struct {
	title string
	count int
	body  string
}

func (d *Data) PrintIssues(w io.Writer) {
	groups := d.GroupData(true, false)

	milestones := d.GetActiveMilestones()

	sections := []*section{}

	// Issues
	for _, title := range milestones {
		count, body := d.printGroups(groups, false, func(item *Item) bool { return item.Issue != nil && item.Issue.Milestone == title })
		sections = append(sections, &section{
			title, count, body,
		})
	}
	// Pending CLs
	// This uses a different grouping (by CL, not by issue) since
	// otherwise we might print a CL twice.
	count, body := d.printGroups(d.GroupData(false, false), false, func(item *Item) bool { return len(item.CLs) > 0 })
	sections = append(sections, &section{
		"Pending CLs",
		count, body,
	})
	// Proposals
	for _, group := range groups {
		if group.Dir == "proposal" {
			count, body := d.printGroups([]*Group{group}, false, func(*Item) bool { return true })
			sections = append(sections, &section{
				"Pending Proposals",
				count, body,
			})
		}
	}
	// Closed
	for _, group := range groups {
		if group.Dir == "closed" {
			count, body := d.printGroups([]*Group{group}, false, func(*Item) bool { return true })
			sections = append(sections, &section{
				"Closed Last Week",
				count, body,
			})
		}
	}

	var titles []string
	for _, s := range sections {
		if s.count > 0 {
			titles = append(titles, fmt.Sprintf("%d %s", s.count, s.title))
		}
	}
	fmt.Fprintf(w, "%s\n", strings.Join(titles, " + "))
	for _, s := range sections {
		if s.count > 0 {
			fmt.Fprintf(w, "\n%s\n%s", s.title, s.body)
		}
	}
}

func (d *Data) PrintCLs(w io.Writer) {
	count, body := d.printGroups(d.GroupData(false, true), true, func(item *Item) bool { return len(item.CLs) > 0 })
	fmt.Fprintf(w, "%d Pending CLs\n", count)
	fmt.Fprintf(w, "\n%s\n%s", "Pending CLs", body)
}

func (d *Data) printGroups(groups []*Group, clDetail bool, match func(*Item) bool) (int, string) {
	var output bytes.Buffer
	var count int
	for _, g := range groups {
		if len(groups) != 1 && (g.Dir == "closed" || g.Dir == "proposal") {
			// These groups shouldn't be shown when printing all groups.
			continue
		}
		var header func()
		header = func() {
			if len(groups) > 1 {
				fmt.Fprintf(&output, "\n%s\n", g.Dir)
			}
			header = func() {}
		}
		for _, item := range g.Items {
			if !match(item) {
				continue
			}
			printed := false
			prefix := ""
			if item.Issue != nil {
				header()
				printed = true
				fmt.Fprintf(&output, "    %-10s  %s", fmt.Sprintf("#%d", item.Issue.Number), item.Issue.Title)
				prefix = "\u2937 "
				var tags []string
				if strings.HasSuffix(item.Issue.Milestone, "Early") {
					tags = append(tags, "early")
				}
				if strings.HasSuffix(item.Issue.Milestone, "Maybe") {
					tags = append(tags, "maybe")
				}
				sort.Strings(item.Issue.Labels)
				for _, label := range item.Issue.Labels {
					switch label {
					case "Documentation":
						tags = append(tags, "doc")
					case "Testing":
						tags = append(tags, "test")
					case "Started":
						tags = append(tags, strings.ToLower(label))
					case "Proposal":
						tags = append(tags, "proposal")
					case "Proposal-Accepted":
						tags = append(tags, "proposal-accepted")
					case "Proposal-Declined":
						tags = append(tags, "proposal-declined")
					}
				}
				if len(tags) > 0 {
					fmt.Fprintf(&output, " [%s]", strings.Join(tags, ", "))
				}
				fmt.Fprintf(&output, "\n")
			}
			for _, cl := range item.CLs {
				header()
				printed = true
				fmt.Fprintf(&output, "    %-10s  %s%s\n", fmt.Sprintf("%sCL %d", prefix, cl.Number), prefix, cl.Subject)
				if clDetail {
					fmt.Fprintf(&output, "    %-10s      %s\n", "", cl.Summary(d.Now))
				}
			}
			if printed {
				count++
			}
		}
	}
	return count, output.String()
}
