package kubernetes

import (
	"context"
	"net"

	"source.monogon.dev/go/net/tinylb"
	"source.monogon.dev/metropolis/node"
	ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
	"source.monogon.dev/metropolis/node/core/curator/watcher"
	"source.monogon.dev/metropolis/pkg/event/memory"
)

// updateLoadBalancerAPIServers provides a tinylb BackendSet memory value with
// the currently known nodes running a Kubernetes apiserver as retrieved from the
// given curator client.
func updateLoadbalancerAPIServers(ctx context.Context, val *memory.Value[tinylb.BackendSet], cur ipb.CuratorClient) error {
	set := &tinylb.BackendSet{}
	val.Set(set.Clone())

	return watcher.WatchNodes(ctx, cur, watcher.SimpleFollower{
		FilterFn: func(a *ipb.Node) bool {
			if a.Status == nil {
				return false
			}
			if a.Status.ExternalAddress == "" {
				return false
			}
			if a.Roles.KubernetesController == nil {
				return false
			}
			return true
		},
		EqualsFn: func(a *ipb.Node, b *ipb.Node) bool {
			return a.Status.ExternalAddress == b.Status.ExternalAddress
		},
		OnNewUpdated: func(new *ipb.Node) error {
			set.Insert(new.Id, &tinylb.SimpleTCPBackend{
				Remote: net.JoinHostPort(new.Status.ExternalAddress, node.KubernetesAPIPort.PortString()),
			})
			val.Set(set.Clone())
			return nil
		},
		OnDeleted: func(prev *ipb.Node) error {
			set.Delete(prev.Id)
			val.Set(set.Clone())
			return nil
		},
	})
}
