package bundleprocessor

import (
	"github.com/iotaledger/goshimmer/packages/model/value_transaction"
	"github.com/iotaledger/goshimmer/packages/shutdown"
	"github.com/iotaledger/goshimmer/plugins/tangle"
	"github.com/iotaledger/hive.go/daemon"
	"github.com/iotaledger/hive.go/events"
	"github.com/iotaledger/hive.go/logger"
	"github.com/iotaledger/hive.go/node"
)

var PLUGIN = node.NewPlugin("Bundle Processor", node.Enabled, configure, run)
var log *logger.Logger

func configure(*node.Plugin) {
	log = logger.NewLogger("Bundle Processor")

	tangle.Events.TransactionSolid.Attach(events.NewClosure(func(tx *value_transaction.ValueTransaction) {
		if tx.IsHead() {
			workerPool.Submit(tx)
		}
	}))

	Events.Error.Attach(events.NewClosure(func(err error) {
		log.Error(err)
	}))
}

func run(*node.Plugin) {
	log.Info("Starting Bundle Processor ...")

	daemon.BackgroundWorker("Bundle Processor", func(shutdownSignal <-chan struct{}) {
		log.Info("Starting Bundle Processor ... done")
		workerPool.Start()
		<-shutdownSignal
		log.Info("Stopping Bundle Processor ...")
		workerPool.StopAndWait()
		log.Info("Stopping Bundle Processor ... done")
	}, shutdown.ShutdownPriorityBundleProcessor)

	log.Info("Starting Value Bundle Processor ...")

	daemon.BackgroundWorker("Value Bundle Processor", func(shutdownSignal <-chan struct{}) {
		log.Info("Starting Value Bundle Processor ... done")
		valueBundleProcessorWorkerPool.Start()
		<-shutdownSignal
		log.Info("Stopping Value Bundle Processor ...")
		valueBundleProcessorWorkerPool.StopAndWait()
		log.Info("Stopping Value Bundle Processor ... done")
	}, shutdown.ShutdownPriorityBundleProcessor)
}