package unix

import (
	"context"
	"net"
	"net/rpc"
	"net/url"
	"ultone/internal/log"
	"ultone/internal/opt"
)

func Start(ctx context.Context) error {
	ready := make(chan bool)
	defer close(ready)

	uri, err := url.Parse(opt.RpcAddress)
	if err != nil {
		return err
	}

	address := uri.Host + uri.Path
	log.Debug(ctx, "[rpc-svc] listen at [%s] [%s]", uri.Scheme, address)

	ln, err := net.Listen(uri.Scheme, address)
	if err != nil {
		return err
	}

	go func() {
		ready <- true
		<-ctx.Done()
		_ = ln.Close()
	}()

	<-ready

	svc := rpc.NewServer()
	if err = svc.RegisterName("svc", &Handler{Ctx: ctx}); err != nil {
		return err
	}

	go func() {
		log.Info(ctx, "[rpc-svc] start at: [%s] [%s]", uri.Scheme, address)
		ready <- true
		svc.Accept(ln)
	}()

	<-ready

	return nil
}