package daemon

import (
	"sync"
)

var (
	running           bool
	wg                sync.WaitGroup
	ShutdownSignal    = make(chan int, 1)
	backgroundWorkers = make([]func(), 0)
	lock              = sync.Mutex{}
)

func runBackgroundWorker(backgroundWorker func()) {
	wg.Add(1)

	go func() {
		backgroundWorker()

		wg.Done()
	}()
}

func BackgroundWorker(handler func()) {
	lock.Lock()

	if IsRunning() {
		runBackgroundWorker(handler)
	} else {
		backgroundWorkers = append(backgroundWorkers, handler)
	}

	lock.Unlock()
}

func Run() {
	if !running {
		lock.Lock()

		if !running {
			ShutdownSignal = make(chan int, 1)

			running = true

			Events.Run.Trigger()

			for _, backgroundWorker := range backgroundWorkers {
				runBackgroundWorker(backgroundWorker)
			}
		}

		lock.Unlock()
	}

	wg.Wait()
}

func Shutdown() {
	if running {
		lock.Lock()

		if running {
			close(ShutdownSignal)

			running = false

			Events.Shutdown.Trigger()
		}

		lock.Unlock()
	}
}

func IsRunning() bool {
	return running
}