package main

// Steps:
// 1. go run .
// 2. go run github.com/pancsta/asyncmachine-go/tools/cmd/arpc@latest -d tmp

import (
	
	
	
	
	
	
	

	
	amhelp 
	am 
	arpc 
)

var ss = states.ExampleStates

func init() {
	// am-dbg is required for debugging, go run it
	// go run github.com/pancsta/asyncmachine-go/tools/cmd/am-dbg@latest
	// amhelp.EnableDebugging(true)
	// amhelp.SetEnvLogLevel(am.LogOps)
}

func main() {
	,  := context.WithCancel(context.Background())
	defer ()

	// handle exit TODO not working
	 := make(chan os.Signal, 1)
	signal.Notify(, syscall.SIGINT, syscall.SIGTERM)

	// workers
	for  := range 3 {
		,  := newWorker(, )
		if  != nil {
			log.Print()
		}

		time.Sleep(100 * time.Millisecond)
		fmt.Printf("start %d\n", )
		.Log("hello")
	}

	// wait
	<-

	fmt.Println("bye")
}

func newWorker( context.Context,  int) (*am.Machine, error) {
	// init

	 := &workerHandlers{}
	 := fmt.Sprintf("worker%d", )
	,  := am.NewCommon(, , states.ExampleSchema,
		ss.Names(), , nil, nil)
	if  != nil {
		return nil, 
	}
	.Mach = 

	// telemetry

	amhelp.MachDebugEnv()
	// worker.SemLogger().SetArgsMapper(am.NewArgsMapper([]string{"log"}, 0))
	.SemLogger().SetLevel(am.LogChanges)
	// start a REPL aRPC server, create an addr file
	arpc.MachRepl(, "", "tmp", nil, nil)

	return , nil
}

type workerHandlers struct {
	*am.ExceptionHandler
	Mach *am.Machine
}

func ( *workerHandlers) ( *am.Event) {
	fmt.Println("FooState")
	.Mach.Log("FooState")
}

func ( *workerHandlers) ( *am.Event) {
	fmt.Println("BarState")
	.Mach.Log("BarState")
}

func ( *workerHandlers) ( *am.Event) {
	fmt.Println("BazState")
	.Mach.Log("BarState")
}