// 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 (
	"context"
	"errors"
	"fmt"

	"github.com/maruel/subcommands"
	"go.chromium.org/luci/auth"
	buildbucketpb "go.chromium.org/luci/buildbucket/proto"
	"google.golang.org/genproto/protobuf/field_mask"
)

func cmdBuild(authOpts auth.Options) *subcommands.Command {
	return &subcommands.Command{
		UsageLine: "build -builder project1/bucket1/builder1, ... [common options]",
		ShortDesc: "Get the last known good build IDs for a set of builders.",
		LongDesc:  "Get the last known good build IDs for a set of builders.",
		CommandRun: func() subcommands.CommandRun {
			c := &buildRun{}
			c.Init(authOpts)
			return c
		},
	}
}

type buildRun struct {
	commonFlags
	builders builders
}

func (c *buildRun) Init(defaultAuthOpts auth.Options) {
	c.commonFlags.Init(defaultAuthOpts)
	c.Flags.Var(&c.builders, "builder", "Builder ID as project/bucket/builder")
}

func (c *buildRun) checkFlags() error {
	if err := c.commonFlags.checkFlags(); err != nil {
		return err
	}
	if len(c.builders) != 1 {
		return errors.New("exactly one -builder may be specified")
	}
	return nil
}

func (c *buildRun) main(a subcommands.Application) error {
	ctx := context.Background()
	client, err := newBuildbucketClient(ctx, c.parsedAuthOpts, c.buildbucketHost)
	if err != nil {
		return fmt.Errorf("failed to initialize client: %v", err)
	}
	// Retrieve build ID.
	mask := &field_mask.FieldMask{
		Paths: []string{"builds.*.id"},
	}
	// If not filtering by gitiles ref, decrease the search range to 1.
	if c.gitilesRef == "" {
		c.searchRange = 1
	}
	builds, err := client.GetBuilds(ctx, c.builders, mask, c.searchRange)
	if err != nil {
		return fmt.Errorf("failed to query builds: %v", err)
	}
	bid, err := getLastKnownGood(builds, c.gitilesRef, func(build *buildbucketpb.Build) interface{} {
		return build.Id
	})
	if err != nil {
		return fmt.Errorf("failed to get last known good build: %v", err)
	}
	fmt.Println(bid)
	return nil
}

func (c *buildRun) Run(a subcommands.Application, args []string, env subcommands.Env) int {
	if err := c.checkFlags(); err != nil {
		fmt.Fprintf(a.GetErr(), "%s: %s\n", a.GetName(), err)
		return 1
	}

	if err := c.main(a); err != nil {
		fmt.Fprintf(a.GetErr(), "%s: %s\n", a.GetName(), err)
		return 1
	}
	return 0
}
