package main

import (
	"log"

	"mojo/public/go/application"
	"mojo/public/go/bindings"
	"mojo/public/go/system"

	"mojom/vanadium/discovery"
)

//#include "mojo/public/c/system/types.h"
import "C"

type advDelegate struct {
	id    int32
	proxy *discovery.Advertiser_Proxy
}

func (a *advDelegate) Initialize(ctx application.Context) {
	req, ptr := discovery.CreateMessagePipeForAdvertiser()
	ctx.ConnectToApplication("https://mojo.v.io/discovery.mojo").ConnectToService(&req)
	a.proxy = discovery.NewAdvertiserProxy(ptr, bindings.GetAsyncWaiter())
	s := discovery.Service{
		InterfaceName: "v.io/discovery.T",
		Addrs:         []string{"localhost:1000", "localhost:2000"},
		Attrs:         map[string]string{"foo": "bar"},
	}
	id, e1, e2 := a.proxy.Advertise(s, nil)
	if e1 != nil || e2 != nil {
		log.Println("Error occurred", e1, e2)
		return
	}

	a.id = id
}

func (*advDelegate) AcceptConnection(connection *application.Connection) {
	connection.Close()
}

func (s *advDelegate) Quit() {
	s.proxy.StopAdvertising(s.id)
}

//export MojoMain
func MojoMain(handle C.MojoHandle) C.MojoResult {
	application.Run(&advDelegate{}, system.MojoHandle(handle))
	return C.MOJO_RESULT_OK
}

func main() {
}
