package cluster

import (
	"context"
	"fmt"
)

// leaderElectorFactoryFunc is a LeaderElector factory method type.
type leaderElectorFactoryFunc func(context.Context, ...interface{}) (
	LeaderElector, error)

var leaderElectorFactories map[string]leaderElectorFactoryFunc

// RegisterLeaderElectorFactory will register a new LeaderElector factory
// method corresponding to the passed id.
func RegisterLeaderElectorFactory(id string, factory leaderElectorFactoryFunc) {
	if leaderElectorFactories == nil {
		leaderElectorFactories = make(
			map[string]leaderElectorFactoryFunc,
		)
	}

	leaderElectorFactories[id] = factory
}

// MakeLeaderElector will construct a LeaderElector identified by id with the
// passed arguments.
func MakeLeaderElector(ctx context.Context, id string, args ...interface{}) (
	LeaderElector, error) {

	if _, ok := leaderElectorFactories[id]; !ok {
		return nil, fmt.Errorf("leader elector factory for '%v' "+
			"not found", id)
	}

	return leaderElectorFactories[id](ctx, args...)
}