// Package autorun contains code to manage automatic runs
package autorun

import "sync"

const (
	// StatusScheduled indicates that OONI is scheduled to run
	// periodically in the background.
	StatusScheduled = "scheduled"

	// StatusStopped indicates that OONI is not scheduled to
	// run periodically in the background.
	StatusStopped = "stopped"

	// StatusRunning indicates that OONI is currently
	// running in the background.
	StatusRunning = "running"
)

// Manager manages automatic runs
type Manager interface {
	LogShow() error
	LogStream() error
	Start() error
	Status() (string, error)
	Stop() error
}

var (
	registry map[string]Manager
	mtx      sync.Mutex
)

func register(platform string, manager Manager) {
	defer mtx.Unlock()
	mtx.Lock()
	if registry == nil {
		registry = make(map[string]Manager)
	}
	registry[platform] = manager
}

// Get gets the specified autorun manager. This function
// returns nil if no autorun manager exists.
func Get(platform string) Manager {
	defer mtx.Unlock()
	mtx.Lock()
	return registry[platform]
}