package main

import (
	
	

	example 
	
	
	amhelp 
	am 
	arpc 
	ssrpc 
	ampipe 
)

var ssF = states.FooStates
var ssB = states.BarStates
var Pass = example.Pass
var PassRpc = example.PassRpc

type A = example.A
type ARpc = example.ARpc

func initMachines(
	 context.Context,  any,  any,
) (*am.Machine, *arpc.Client, *am.Machine) {

	//

	// Browser machine (local)

	//

	 := utils.RandId(3)
	,  := am.NewCommon(, "browser-bar-"+, states.BarSchema, ssB.Names(), , nil, nil)
	if  != nil {
		log.Fatal(.Error())
	}
	.SemLogger().SetArgsMapper(example.LogArgs)
	amhelp.MachDebugEnv()
	arpc.MachReplWs(, example.EnvRelayHttpAddr, &arpc.ReplOpts{
		// TODO should be automatic in WASM
		WebSocketTunnel: arpc.WsListenPath("repl-"+.Id(), example.EnvBarReplAddr),
		Args:            ARpc{},
		ParseRpc:        example.ParseRpc,
	})

	// RPC Server

	,  := arpc.NewServer(, example.EnvRelayHttpAddr, .Id(), , &arpc.ServerOpts{
		// eg localhost:8080/listen/bar/localhost:7070 opens 7070 for "bar"
		// TODO should be automatic in WASM
		WebSocketTunnel: arpc.WsListenPath(.Id(), example.EnvBarTcpAddr),
		Parent:          ,
	})
	if  != nil {
		log.Fatal(.Error())
	}
	.Start(nil)

	//

	// Server machine (remote)

	//

	// RPC Handlers Machine

	,  := am.NewCommon(, "browser-foo-"+, states.FooSchema, ssF.Names(), , , &am.Opts{
		Tags: []string{"rpc-handler"},
	})
	if  != nil {
		log.Fatal(.Error())
	}
	amhelp.MachDebugEnv()
	.SemLogger().SetArgsMapper(example.LogArgs)

	// RPC Client (Net Machine)

	// TODO enable
	,  := arpc.NewClient(, example.EnvFooWsAddr, .Id(), states.FooSchema, &arpc.ClientOpts{
		Parent: ,
		// automatic in WASM
		WebSocket: "/",
	})
	if  != nil {
		log.Fatal(.Error())
	}

	// wait for RPC
	.Start(nil)
	<-.Mach.When1(ssrpc.ClientStates.Ready, nil)

	// bind and sync the handler mach to net mach
	if  := ampipe.BindAny(.NetMach, );  != nil {
		log.Fatal(.Error())
	}
	.Set(.NetMach.ActiveStates(nil), nil)

	// start and wait
	.Add1(ssB.Start, nil)

	return , , 
}