package main

/*
	Find results of a task across a range of commits given by a git log expression.

	This is essentially a CLI version of status.skia.org, but for a single task
	and with better support for git log expressions and the ability to go beyond
	the 200-commit limit.

	Example:

	$ go run ./find_task_results_by_git_log.go
		--task=Test-Debian10-Clang-NUC7i5BNK-GPU-IntelIris640-x86_64-Debug-All-DDL3_ASAN_Vulkan
		d9d9e21..817dba1
	Found 5 commits
	817dba1 SUCCESS
	f0b283e SUCCESS
	2739def SUCCESS
	569bf57 FAILURE
	a8d3807 FAILURE
*/

import (
	"context"
	"flag"
	"fmt"

	"cloud.google.com/go/datastore"
	"go.skia.org/infra/go/auth"
	"go.skia.org/infra/go/common"
	"go.skia.org/infra/go/git"
	"go.skia.org/infra/go/gitiles"
	"go.skia.org/infra/go/httputils"
	"go.skia.org/infra/go/sklog"
	"go.skia.org/infra/task_scheduler/go/db"
	"go.skia.org/infra/task_scheduler/go/db/firestore"
	"golang.org/x/oauth2/google"
)

var (
	repo  = flag.String("repo", common.REPO_SKIA, "Git repository to search.")
	task  = flag.String("task", "", "Name of the task to search.")
	limit = flag.Int("limit", 100, "Limit to this many commits")
)

func main() {
	flag.Parse()

	if *task == "" {
		sklog.Fatal("--task is required.")
	}

	logExpr := flag.Arg(0)
	if logExpr == "" {
		logExpr = git.MainBranch
	}

	ctx := context.Background()

	ts, err := google.DefaultTokenSource(ctx, auth.ScopeGerrit, datastore.ScopeDatastore)
	if err != nil {
		sklog.Fatal(err)
	}
	client := httputils.DefaultClientConfig().WithTokenSource(ts).Client()

	d, err := firestore.NewDBWithParams(ctx, firestore.FIRESTORE_PROJECT, "production", ts)
	if err != nil {
		sklog.Fatal(err)
	}

	commits, err := gitiles.NewRepo(*repo, client).Log(ctx, logExpr, gitiles.LogLimit(*limit))
	if err != nil {
		sklog.Fatal(err)
	}
	fmt.Println(fmt.Sprintf("Found %d commits", len(commits)))
	noIssue := ""
	for _, commit := range commits {
		tasks, err := d.SearchTasks(ctx, &db.TaskSearchParams{
			Name:     task,
			Repo:     repo,
			Revision: &commit.Hash,
			Issue:    &noIssue,
		})
		if err != nil {
			sklog.Fatal(err)
		}
		statusStr := ""
		for _, task := range tasks {
			statusStr += " " + string(task.Status)
		}
		fmt.Println(fmt.Sprintf("%s%s", commit.Hash[:7], statusStr))
	}
}
