package vmalertutil

import (
	"strings"

	"github.com/VictoriaMetrics/VictoriaMetrics/lib/promauth"
)

// AuthConfigOptions options which helps build promauth.Config
type AuthConfigOptions func(config *promauth.HTTPClientConfig)

// AuthConfig returns promauth.Config based on the given params
func AuthConfig(filterOptions ...AuthConfigOptions) (*promauth.Config, error) {
	authCfg := &promauth.HTTPClientConfig{}
	for _, option := range filterOptions {
		option(authCfg)
	}

	return authCfg.NewConfig(".")
}

// WithBasicAuth returns AuthConfigOptions and initialized promauth.BasicAuthConfig based on given params
func WithBasicAuth(username, usernameFile, password, passwordFile string) AuthConfigOptions {
	return func(config *promauth.HTTPClientConfig) {
		if username != "" || usernameFile != "" || password != "" || passwordFile != "" {
			config.BasicAuth = &promauth.BasicAuthConfig{
				Username:     username,
				UsernameFile: usernameFile,
				Password:     promauth.NewSecret(password),
				PasswordFile: passwordFile,
			}
		}
	}
}

// WithBearer returns AuthConfigOptions and set BearerToken or BearerTokenFile based on given params
func WithBearer(token, tokenFile string) AuthConfigOptions {
	return func(config *promauth.HTTPClientConfig) {
		if token != "" {
			config.BearerToken = promauth.NewSecret(token)
		}
		if tokenFile != "" {
			config.BearerTokenFile = tokenFile
		}
	}
}

// WithOAuth returns AuthConfigOptions and set OAuth params based on given params
func WithOAuth(clientID, clientSecret, clientSecretFile, tokenURL, scopes string, endpointParams map[string]string) AuthConfigOptions {
	return func(config *promauth.HTTPClientConfig) {
		if clientSecretFile != "" || clientSecret != "" {
			config.OAuth2 = &promauth.OAuth2Config{
				ClientID:         clientID,
				ClientSecret:     promauth.NewSecret(clientSecret),
				ClientSecretFile: clientSecretFile,
				EndpointParams:   endpointParams,
				TokenURL:         tokenURL,
				Scopes:           strings.Split(scopes, ";"),
			}
		}
	}
}

// WithHeaders returns AuthConfigOptions and set Headers based on the given params
func WithHeaders(headers string) AuthConfigOptions {
	return func(config *promauth.HTTPClientConfig) {
		if headers != "" {
			config.Headers = strings.Split(headers, "^^")
		}
	}
}
