package libp2p

import (
	
	
	rcmgr 
	circuit 
	relayv2 
	
	
	
)

// SetDefaultServiceLimits sets the default limits for bundled libp2p services
func ( *rcmgr.ScalingLimitConfig) {
	// identify
	.AddServiceLimit(
		identify.ServiceName,
		rcmgr.BaseLimit{StreamsInbound: 64, StreamsOutbound: 64, Streams: 128, Memory: 4 << 20},
		rcmgr.BaseLimitIncrease{StreamsInbound: 64, StreamsOutbound: 64, Streams: 128, Memory: 4 << 20},
	)
	.AddServicePeerLimit(
		identify.ServiceName,
		rcmgr.BaseLimit{StreamsInbound: 16, StreamsOutbound: 16, Streams: 32, Memory: 1 << 20},
		rcmgr.BaseLimitIncrease{},
	)
	for ,  := range [...]protocol.ID{identify.ID, identify.IDPush} {
		.AddProtocolLimit(
			,
			rcmgr.BaseLimit{StreamsInbound: 64, StreamsOutbound: 64, Streams: 128, Memory: 4 << 20},
			rcmgr.BaseLimitIncrease{StreamsInbound: 64, StreamsOutbound: 64, Streams: 128, Memory: 4 << 20},
		)
		.AddProtocolPeerLimit(
			,
			rcmgr.BaseLimit{StreamsInbound: 16, StreamsOutbound: 16, Streams: 32, Memory: 32 * (256<<20 + 16<<10)},
			rcmgr.BaseLimitIncrease{},
		)
	}

	//  ping
	addServiceAndProtocolLimit(,
		ping.ServiceName, ping.ID,
		rcmgr.BaseLimit{StreamsInbound: 64, StreamsOutbound: 64, Streams: 64, Memory: 4 << 20},
		rcmgr.BaseLimitIncrease{StreamsInbound: 64, StreamsOutbound: 64, Streams: 64, Memory: 4 << 20},
	)
	addServicePeerAndProtocolPeerLimit(
		,
		ping.ServiceName, ping.ID,
		rcmgr.BaseLimit{StreamsInbound: 2, StreamsOutbound: 3, Streams: 4, Memory: 32 * (256<<20 + 16<<10)},
		rcmgr.BaseLimitIncrease{},
	)

	// autonat
	addServiceAndProtocolLimit(,
		autonat.ServiceName, autonat.AutoNATProto,
		rcmgr.BaseLimit{StreamsInbound: 64, StreamsOutbound: 64, Streams: 64, Memory: 4 << 20},
		rcmgr.BaseLimitIncrease{StreamsInbound: 4, StreamsOutbound: 4, Streams: 4, Memory: 2 << 20},
	)
	addServicePeerAndProtocolPeerLimit(
		,
		autonat.ServiceName, autonat.AutoNATProto,
		rcmgr.BaseLimit{StreamsInbound: 2, StreamsOutbound: 2, Streams: 2, Memory: 1 << 20},
		rcmgr.BaseLimitIncrease{},
	)

	// holepunch
	addServiceAndProtocolLimit(,
		holepunch.ServiceName, holepunch.Protocol,
		rcmgr.BaseLimit{StreamsInbound: 32, StreamsOutbound: 32, Streams: 64, Memory: 4 << 20},
		rcmgr.BaseLimitIncrease{StreamsInbound: 8, StreamsOutbound: 8, Streams: 16, Memory: 4 << 20},
	)
	addServicePeerAndProtocolPeerLimit(,
		holepunch.ServiceName, holepunch.Protocol,
		rcmgr.BaseLimit{StreamsInbound: 2, StreamsOutbound: 2, Streams: 2, Memory: 1 << 20},
		rcmgr.BaseLimitIncrease{},
	)

	// relay/v2
	.AddServiceLimit(
		relayv2.ServiceName,
		rcmgr.BaseLimit{StreamsInbound: 256, StreamsOutbound: 256, Streams: 256, Memory: 16 << 20},
		rcmgr.BaseLimitIncrease{StreamsInbound: 256, StreamsOutbound: 256, Streams: 256, Memory: 16 << 20},
	)
	.AddServicePeerLimit(
		relayv2.ServiceName,
		rcmgr.BaseLimit{StreamsInbound: 64, StreamsOutbound: 64, Streams: 64, Memory: 1 << 20},
		rcmgr.BaseLimitIncrease{},
	)

	// circuit protocols, both client and service
	for ,  := range [...]protocol.ID{circuit.ProtoIDv2Hop, circuit.ProtoIDv2Stop} {
		.AddProtocolLimit(
			,
			rcmgr.BaseLimit{StreamsInbound: 640, StreamsOutbound: 640, Streams: 640, Memory: 16 << 20},
			rcmgr.BaseLimitIncrease{StreamsInbound: 640, StreamsOutbound: 640, Streams: 640, Memory: 16 << 20},
		)
		.AddProtocolPeerLimit(
			,
			rcmgr.BaseLimit{StreamsInbound: 128, StreamsOutbound: 128, Streams: 128, Memory: 32 << 20},
			rcmgr.BaseLimitIncrease{},
		)
	}
}

func addServiceAndProtocolLimit( *rcmgr.ScalingLimitConfig,  string,  protocol.ID,  rcmgr.BaseLimit,  rcmgr.BaseLimitIncrease) {
	.AddServiceLimit(, , )
	.AddProtocolLimit(, , )
}

func addServicePeerAndProtocolPeerLimit( *rcmgr.ScalingLimitConfig,  string,  protocol.ID,  rcmgr.BaseLimit,  rcmgr.BaseLimitIncrease) {
	.AddServicePeerLimit(, , )
	.AddProtocolPeerLimit(, , )
}