// Package providers builds different kinds of provider.Provider.
package providers

import (
	"context"

	"go.skia.org/infra/go/auth"
	"go.skia.org/infra/go/httputils"
	"go.skia.org/infra/go/skerr"
	"go.skia.org/infra/go/util"
	"go.skia.org/infra/perf/go/config"
	"go.skia.org/infra/perf/go/git/provider"
	"go.skia.org/infra/perf/go/git/providers/git_checkout"
	"go.skia.org/infra/perf/go/git/providers/gitiles"
	"golang.org/x/oauth2/google"
)

// New builds a Provider based on the instance config.
func New(ctx context.Context, instanceConfig *config.InstanceConfig) (provider.Provider, error) {
	prov := instanceConfig.GitRepoConfig.Provider

	if util.In(string(prov), []string{"", string(config.GitProviderCLI)}) {
		return git_checkout.New(ctx, instanceConfig)
	} else if prov == config.GitProviderGitiles {
		ts, err := google.DefaultTokenSource(ctx, auth.ScopeGerrit)
		client := httputils.DefaultClientConfig().WithTokenSource(ts).Client()
		if err != nil {
			return nil, skerr.Wrap(err)
		}
		return gitiles.New(client, instanceConfig), nil
	}
	return nil, skerr.Fmt("invalid type of Provider selected: %q expected one of %q", instanceConfig.GitRepoConfig.Provider, config.AllGitProviders)
}
