// Copyright 2019 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 gcs

import (
	"context"

	"fmt"

	"cloud.google.com/go/storage"
	"go.chromium.org/luci/auth"
	"google.golang.org/api/option"
)

// NewClient returns a storage.Client that uses LUCI auth with silent login by
// default.
func NewClient(ctx context.Context, opts auth.Options) (*storage.Client, error) {
	return NewClientWithLoginMode(ctx, auth.SilentLogin, opts)
}

// NewClientWithLogin mode returns a storage.Client that uses LUCI auth.
func NewClientWithLoginMode(ctx context.Context, mode auth.LoginMode, opts auth.Options) (*storage.Client, error) {
	authenticator := auth.NewAuthenticator(ctx, mode, opts)
	source, err := authenticator.TokenSource()
	if err != nil {
		return nil, fmt.Errorf("failed to create token source: %v", err)
	}

	client, err := storage.NewClient(ctx, option.WithTokenSource(source))
	if err != nil {
		return nil, fmt.Errorf("failed to create Cloud Storage client: %v", err)
	}
	return client, nil
}
