package pubsub

import (
	

	
	
	
)

const (
	FloodSubID              = protocol.ID("/floodsub/1.0.0")
	FloodSubTopicSearchSize = 5
)

// NewFloodsubWithProtocols returns a new floodsub-enabled PubSub objecting using the protocols specified in ps.
func ( context.Context,  host.Host,  []protocol.ID,  ...Option) (*PubSub, error) {
	 := &FloodSubRouter{
		protocols: ,
	}
	return NewPubSub(, , , ...)
}

// NewFloodSub returns a new PubSub object using the FloodSubRouter.
func ( context.Context,  host.Host,  ...Option) (*PubSub, error) {
	return NewFloodsubWithProtocols(, , []protocol.ID{FloodSubID}, ...)
}

type FloodSubRouter struct {
	p         *PubSub
	protocols []protocol.ID
	tracer    *pubsubTracer
}

func ( *FloodSubRouter) () []protocol.ID {
	return .protocols
}

func ( *FloodSubRouter) ( *PubSub) {
	.p = 
	.tracer = .tracer
}

func ( *FloodSubRouter) ( peer.ID,  protocol.ID) {
	.tracer.AddPeer(, )
}

func ( *FloodSubRouter) ( peer.ID) {
	.tracer.RemovePeer()
}

func ( *FloodSubRouter) ( string,  int) bool {
	// check all peers in the topic
	,  := .p.topics[]
	if ! {
		return false
	}

	if  == 0 {
		 = FloodSubTopicSearchSize
	}

	if len() >=  {
		return true
	}

	return false
}

func ( *FloodSubRouter) (peer.ID) AcceptStatus {
	return AcceptAll
}

func ( *FloodSubRouter) ([]*Message) {}

func ( *FloodSubRouter) ( *RPC) {}

func ( *FloodSubRouter) ( *Message) {
	 := .ReceivedFrom
	 := .GetTopic()

	 := rpcWithMessages(.Message)
	for  := range .p.topics[] {
		if  ==  ||  == peer.ID(.GetFrom()) {
			continue
		}

		,  := .p.peers[]
		if ! {
			continue
		}

		 := .Push(, false)
		if  != nil {
			log.Infof("dropping message to peer %s: queue full", )
			.tracer.DropRPC(, )
			// Drop it. The peer is too slow.
			continue
		}
		.tracer.SendRPC(, )
	}
}

func ( *FloodSubRouter) ( string) {
	.tracer.Join()
}

func ( *FloodSubRouter) ( string) {
	.tracer.Leave()
}