package api

import (
	"context"
	"fmt"
	"github.com/loveuer/nf/nft/log"
	"net"
	"ultone/internal/opt"
	"ultone/internal/tool"
)

func Start(ctx context.Context) error {

	app := initApp(ctx)
	ready := make(chan bool)

	ln, err := net.Listen("tcp", opt.Cfg.Listen.Http)
	if err != nil {
		return fmt.Errorf("api.MustStart: net listen tcp address=%v err=%v", opt.Cfg.Listen.Http, err)
	}

	go func() {
		ready <- true

		if err = app.RunListener(ln); err != nil {
			log.Panic("api.MustStart: app run err=%v", err)
		}
	}()

	<-ready

	go func() {
		ready <- true
		<-ctx.Done()
		if err = app.Shutdown(tool.Timeout(1)); err != nil {
			log.Error("api.MustStart: app shutdown err=%v", err)
		}
	}()

	<-ready

	return nil
}