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() {
	,  := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
	defer ()

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

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

	// wait
	<-.Done()

	fmt.Println("bye")
}

func newStateSource( context.Context,  int) (*am.Machine, error) {
	// init
	 := &handlers{}
	 := fmt.Sprintf("worker%d", )
	,  := am.NewCommon(, , states.ExampleSchema,
		ss.Names(), , nil, nil)
	if  != nil {
		return nil, 
	}
	.Mach = 

	// telemetry

	amhelp.MachDebugEnv()
	// worker.SemLogger().SetArgsMapper(am.NewLogArgsMapper([]string{"log"}, 0))
	.SemLogger().SetLevel(am.LogChanges)
	.SetGroups(states.ExampleGroups, states.ExampleStates)
	// start a REPL aRPC server, create an addr file of a rand addr
	 = arpc.MachRepl(, "", &arpc.ReplOpts{
		AddrDir: "tmp",
		// TODO args completion
	})
	if  != nil {
		return nil, 
	}

	return , nil
}

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

var _ = ss.Foo

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

var _ = ss.Bar

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

var _ = ss.Baz

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