package main

import (
	
	
	
	
	
	
	

	
	amhelp 
	am 
	arpc 
	ssrpc 
)

const addr = "localhost:8090"

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
	 := make(chan os.Signal, 1)
	signal.Notify(, syscall.SIGINT, syscall.SIGTERM)
	go func() {
		<-
		()
	}()

	// worker
	,  := newClient(, addr, states.ExampleSchema, ss.Names())
	if  != nil {
		panic()
	}

	// connect
	.Start()
	 = amhelp.WaitForAll(, 3*time.Second,
		.Mach.When1(ssrpc.ClientStates.Ready, ))
	fmt.Printf("Connected to aRPC %s\n", .Addr)

	// randomly mutate the remote worker
	 := time.NewTicker(1 * time.Second)
	for {
		 := false
		select {
		case <-.C:
			switch rand.Intn(2) {
			case 0:
				.Worker.Add1(ss.Foo, nil)
			case 1:
				.Worker.Add1(ss.Bar, nil)
			case 2:
				.Worker.Add1(ss.Baz, nil)
			}
		case <-.Done():
			 = true
		}
		if  {
			break
		}
	}

	fmt.Println("bye")
}

func newClient(
	 context.Context,  string,  am.Schema,  am.S,
) (*arpc.Client, error) {

	// consumer
	 := am.New(, ssrpc.ConsumerSchema, nil)
	 := .BindHandlers(&clientHandlers{})
	if  != nil {
		return nil, 
	}

	// init
	,  := arpc.NewClient(, , "clientid", , , &arpc.ClientOpts{
		Consumer: ,
	})
	if  != nil {
		panic()
	}
	amhelp.MachDebugEnv(.Mach)

	return , nil
}

type clientHandlers struct {
	*am.ExceptionHandler
}

func ( *clientHandlers) ( *am.Event) {
	.Machine().Remove1(ssrpc.ConsumerStates.WorkerPayload, nil)

	 := arpc.ParseArgs(.Args)
	println("Payload: " + .Payload.Data.(string))
}