package khatru

import (
	"fiatjaf.com/nostr"
)

type Router struct{ *Relay }

type Route struct {
	eventMatcher  func(*nostr.Event) bool
	filterMatcher func(nostr.Filter) bool
	relay         *Relay
}

type routeBuilder struct {
	router        *Router
	eventMatcher  func(*nostr.Event) bool
	filterMatcher func(nostr.Filter) bool
}

func NewRouter() *Router {
	rr := &Router{Relay: NewRelay()}
	rr.routes = make([]Route, 0, 3)
	rr.getSubRelayFromFilter = func(f nostr.Filter) *Relay {
		for _, route := range rr.routes {
			if route.filterMatcher == nil || route.filterMatcher(f) {
				return route.relay
			}
		}
		return rr.Relay
	}
	rr.getSubRelayFromEvent = func(e *nostr.Event) *Relay {
		for _, route := range rr.routes {
			if route.eventMatcher == nil || route.eventMatcher(e) {
				return route.relay
			}
		}
		return rr.Relay
	}
	return rr
}

func (rr *Router) Route() routeBuilder {
	return routeBuilder{
		router:        rr,
		filterMatcher: func(f nostr.Filter) bool { return false },
		eventMatcher:  func(e *nostr.Event) bool { return false },
	}
}

func (rb routeBuilder) Req(fn func(nostr.Filter) bool) routeBuilder {
	rb.filterMatcher = fn
	return rb
}

func (rb routeBuilder) AnyReq() routeBuilder {
	rb.filterMatcher = nil
	return rb
}

func (rb routeBuilder) Event(fn func(*nostr.Event) bool) routeBuilder {
	rb.eventMatcher = fn
	return rb
}

func (rb routeBuilder) AnyEvent() routeBuilder {
	rb.eventMatcher = nil
	return rb
}

func (rb routeBuilder) Relay(relay *Relay) {
	rb.router.routes = append(rb.router.routes, Route{
		filterMatcher: rb.filterMatcher,
		eventMatcher:  rb.eventMatcher,
		relay:         relay,
	})
}
