package libp2pwebtransport

import (
	
	
	
	

	ma 
	manet 
	
	
)

var webtransportMA = ma.StringCast("/quic-v1/webtransport")

func toWebtransportMultiaddr( net.Addr) (ma.Multiaddr, error) {
	,  := manet.FromNetAddr()
	if  != nil {
		return nil, 
	}
	if ,  := .ValueForProtocol(ma.P_UDP);  != nil {
		return nil, errors.New("not a UDP address")
	}
	return .Encapsulate(webtransportMA), nil
}

func stringToWebtransportMultiaddr( string) (ma.Multiaddr, error) {
	, ,  := net.SplitHostPort()
	if  != nil {
		return nil, 
	}
	,  := strconv.ParseInt(, 10, 32)
	if  != nil {
		return nil, 
	}
	 := net.ParseIP()
	if  == nil {
		return nil, errors.New("failed to parse IP")
	}
	return toWebtransportMultiaddr(&net.UDPAddr{IP: , Port: int()})
}

func extractCertHashes( ma.Multiaddr) ([]multihash.DecodedMultihash, error) {
	 := make([]string, 0, 2)
	ma.ForEach(, func( ma.Component) bool {
		if .Protocol().Code == ma.P_CERTHASH {
			 = append(, .Value())
		}
		return true
	})
	 := make([]multihash.DecodedMultihash, 0, len())
	for ,  := range  {
		, ,  := multibase.Decode()
		if  != nil {
			return nil, fmt.Errorf("failed to multibase-decode certificate hash: %w", )
		}
		,  := multihash.Decode()
		if  != nil {
			return nil, fmt.Errorf("failed to multihash-decode certificate hash: %w", )
		}
		 = append(, *)
	}
	return , nil
}

func addrComponentForCert( []byte) (*ma.Component, error) {
	,  := multihash.Encode(, multihash.SHA2_256)
	if  != nil {
		return nil, 
	}
	,  := multibase.Encode(multibase.Base58BTC, )
	if  != nil {
		return nil, 
	}
	return ma.NewComponent(ma.ProtocolWithCode(ma.P_CERTHASH).Name, )
}

// IsWebtransportMultiaddr returns true if the given multiaddr is a well formed
// webtransport multiaddr. Returns the number of certhashes found.
func ( ma.Multiaddr) (bool, int) {
	const (
		 = iota
		
		
		
	)
	 := 
	 := 0

	ma.ForEach(, func( ma.Component) bool {
		switch .Protocol().Code {
		case ma.P_UDP:
			if  ==  {
				 = 
			}
		case ma.P_QUIC_V1:
			if  ==  {
				 = 
			}
		case ma.P_WEBTRANSPORT:
			if  ==  {
				 = 
			}
		case ma.P_CERTHASH:
			if  ==  {
				++
			}
		}
		return true
	})
	return  == , 
}