package infra

import (
	"context"
	"log"
	"time"

	"git.apinb.com/bsm-sdk/core/print"
	"git.apinb.com/bsm-sdk/core/utils"
	clientv3 "go.etcd.io/etcd/client/v3"
)

var (
	Service    service
	RootPrefix string = "/bsm_services/"
)

type service struct{}

func (s *service) Register(cli *clientv3.Client, serviceName string, port int) error {
	lease := clientv3.NewLease(cli)
	grantResp, err := lease.Grant(context.TODO(), 5)
	if err != nil {
		return err
	}

	serviceAddr := utils.GetLocationIP() + ":" + utils.Int2String(port)

	key := RootPrefix + serviceName + "/" + utils.Int642String(time.Now().UnixNano())
	_, err = cli.KV.Put(context.TODO(), key, serviceAddr, clientv3.WithLease(grantResp.ID))
	if err != nil {
		return err
	}

	keepAliveChan, err := lease.KeepAlive(context.TODO(), grantResp.ID)
	if err != nil {
		return err
	}

	print.Info("[BSM Register] Service Key: %s", key)
	print.Info("[BSM Register] Service Val: %s", serviceAddr)

	print.Success("[BSM Register] Service Register Complete.")

	go func() {
		for keepAliveResp := range keepAliveChan {
			if keepAliveResp == nil {
				log.Println("LeaseKeepAlive", "Failed")
				return
			}
		}
	}()
	return nil
}