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

	"github.com/maruel/subcommands"

	"go.chromium.org/luci/auth"
	"go.chromium.org/luci/auth/client/authcli"
	buildbucketpb "go.chromium.org/luci/buildbucket/proto"
)

type commonFlags struct {
	subcommands.CommandRunBase
	buildbucketHost string
	gitilesRef      string
	searchRange     int
	authFlags       authcli.Flags

	parsedAuthOpts auth.Options
}

func (c *commonFlags) Init(authOpts auth.Options) {
	c.authFlags = authcli.Flags{}
	c.authFlags.Register(&c.Flags, authOpts)
	c.Flags.StringVar(&c.buildbucketHost, "host", "cr-buildbucket.appspot.com", "Buildbucket hostname")
	c.Flags.StringVar(&c.gitilesRef, "gitiles-ref", "", "Optionally filter for matching gitiles ref e.g. refs/heads/main")
	c.Flags.IntVar(&c.searchRange, "search-range", 25, "Number of builds to search")
}

func (c *commonFlags) checkFlags() error {
	var err error
	c.parsedAuthOpts, err = c.authFlags.Options()
	if err != nil {
		return err
	}
	if c.buildbucketHost == "" {
		return fmt.Errorf("-host is required")
	}
	return nil
}

// newBuilderID returns a *buildbucketpb.BuilderID for a project/bucket/builder string.
func newBuilderID(builder string) (*buildbucketpb.BuilderID, error) {
	components := strings.Split(builder, "/")
	if len(components) != 3 {
		return nil, fmt.Errorf("failed to parse builder %s", builder)
	}
	return &buildbucketpb.BuilderID{
		Project: components[0],
		Bucket:  components[1],
		Builder: components[2],
	}, nil
}

// builders is a flag.Getter implementation representing a []*buildbucketpb.BuilderID.
type builders []*buildbucketpb.BuilderID

// String returns a comma-separated string representation of the builder IDs.
func (b builders) String() string {
	strs := make([]string, len(b))
	for i, bid := range b {
		strs[i] = bid.String()
	}
	return strings.Join(strs, ", ")
}

// Set records seeing a flag value.
func (b *builders) Set(val string) error {
	bid, err := newBuilderID(val)
	if err != nil {
		return err
	}
	*b = append(*b, bid)
	return nil
}

// Get retrieves the flag value.
func (b builders) Get() any {
	return []*buildbucketpb.BuilderID(b)
}
