package proto_netlink

import (
	"github.com/bio-routing/bio-rd/config"
	"github.com/bio-routing/bio-rd/routingtable"
	"github.com/bio-routing/bio-rd/routingtable/locRIB"
)

type NetlinkServer struct {
	locRib *locRIB.LocRIB

	writer *NetlinkWriter
	reader *NetlinkReader
}

func NewNetlinkServer(options *config.Netlink, locRib *locRIB.LocRIB) *NetlinkServer {

	n := &NetlinkServer{
		locRib: locRib,
		writer: NewNetlinkWriter(options),
		reader: NewNetlinkReader(options),
	}
	return n
}

func (n *NetlinkServer) Start() {
	// connect all RIBs
	options := routingtable.ClientOptions{
		BestOnly: false,
		EcmpOnly: false,
		MaxPaths: ^uint(0), // max int
	}

	// 1. from locRib to Kernel
	n.locRib.ClientManager.RegisterWithOptions(n.writer, options)

	// 2. vom Kernel to locRib
	n.reader.ClientManager.RegisterWithOptions(n.locRib, options)

	// Listn for new routes from kernel
	go n.reader.Read()
}