package evaluator

import (
	"github.com/pomerium/pomerium/config"
)

type evaluatorConfig struct {
	policies                                          []config.Policy
	clientCA                                          []byte
	signingKey                                        string
	authenticateURL                                   string
	googleCloudServerlessAuthenticationServiceAccount string
	jwtClaimsHeaders                                  config.JWTClaimHeaders
}

// An Option customizes the evaluator config.
type Option func(*evaluatorConfig)

func getConfig(options ...Option) *evaluatorConfig {
	cfg := new(evaluatorConfig)
	for _, o := range options {
		o(cfg)
	}
	return cfg
}

// WithPolicies sets the policies in the config.
func WithPolicies(policies []config.Policy) Option {
	return func(cfg *evaluatorConfig) {
		cfg.policies = policies
	}
}

// WithClientCA sets the client CA in the config.
func WithClientCA(clientCA []byte) Option {
	return func(cfg *evaluatorConfig) {
		cfg.clientCA = clientCA
	}
}

// WithSigningKey sets the signing key and algorithm in the config.
func WithSigningKey(signingKey string) Option {
	return func(cfg *evaluatorConfig) {
		cfg.signingKey = signingKey
	}
}

// WithAuthenticateURL sets the authenticate URL in the config.
func WithAuthenticateURL(authenticateURL string) Option {
	return func(cfg *evaluatorConfig) {
		cfg.authenticateURL = authenticateURL
	}
}

// WithGoogleCloudServerlessAuthenticationServiceAccount sets the google cloud serverless authentication service
// account in the config.
func WithGoogleCloudServerlessAuthenticationServiceAccount(serviceAccount string) Option {
	return func(cfg *evaluatorConfig) {
		cfg.googleCloudServerlessAuthenticationServiceAccount = serviceAccount
	}
}

// WithJWTClaimsHeaders sets the JWT claims headers in the config.
func WithJWTClaimsHeaders(headers config.JWTClaimHeaders) Option {
	return func(cfg *evaluatorConfig) {
		cfg.jwtClaimsHeaders = headers
	}
}