// Copyright 2020 The Fuchsia 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 main

import (
	"log"
	"os"

	"github.com/maruel/subcommands"

	"go.chromium.org/luci/auth"
	"go.chromium.org/luci/auth/client/authcli"
	"go.chromium.org/luci/client/versioncli"
	"go.chromium.org/luci/common/api/gerrit"
	"go.chromium.org/luci/common/api/gitiles"
	"go.chromium.org/luci/hardcoded/chromeinfra"
)

// Version must be updated on functional change (behavior, arguments, supported commands).
const version = "0.0.1"

func getApplication(defaultAuthOpts auth.Options) *subcommands.DefaultApplication {
	defaultAuthOpts.Scopes = []string{gitiles.OAuthScope, gerrit.OAuthScope}
	return &subcommands.DefaultApplication{
		Name:  "cl-util",
		Title: "Client for manipulating gerrit CLs.",
		Commands: []*subcommands.Command{
			cmdCreateCL(defaultAuthOpts),
			cmdTriggerCQ(defaultAuthOpts),
			authcli.SubcommandInfo(defaultAuthOpts, "whoami", false),
			authcli.SubcommandLogin(defaultAuthOpts, "login", false),
			authcli.SubcommandLogout(defaultAuthOpts, "logout", false),
			versioncli.CmdVersion(version),
			subcommands.CmdHelp,
		},
	}
}

func main() {
	log.SetFlags(log.Lmicroseconds)
	app := getApplication(chromeinfra.DefaultAuthOptions())
	os.Exit(subcommands.Run(app, nil))
}
