package libp2pwebrtc

import (
	"encoding/hex"
	"net"
	"testing"

	"github.com/multiformats/go-multihash"
	"github.com/stretchr/testify/require"
)

const expectedServerSDP = `v=0
o=- 0 0 IN IP4 0.0.0.0
s=-
t=0 0
a=ice-lite
m=application 37826 UDP/DTLS/SCTP webrtc-datachannel
c=IN IP4 0.0.0.0
a=mid:0
a=ice-options:ice2
a=ice-ufrag:d2c0fc07-8bb3-42ae-bae2-a6fce8a0b581
a=ice-pwd:d2c0fc07-8bb3-42ae-bae2-a6fce8a0b581
a=fingerprint:sha-256 ba:78:16:bf:8f:01:cf:ea:41:41:40:de:5d:ae:22:23:b0:03:61:a3:96:17:7a:9c:b4:10:ff:61:f2:00:15:ad

a=setup:passive
a=sctp-port:5000
a=max-message-size:16384
a=candidate:1 1 UDP 1 0.0.0.0 37826 typ host
a=end-of-candidates
`

func TestRenderServerSDP(t *testing.T) {
	encoded, err := hex.DecodeString("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad")
	require.NoError(t, err)

	testMultihash := multihash.DecodedMultihash{
		Code:   multihash.SHA2_256,
		Name:   multihash.Codes[multihash.SHA2_256],
		Digest: encoded,
		Length: len(encoded),
	}
	addr := &net.UDPAddr{IP: net.IPv4(0, 0, 0, 0), Port: 37826}
	ufrag := "d2c0fc07-8bb3-42ae-bae2-a6fce8a0b581"
	fingerprint := testMultihash

	sdp, err := createServerSDP(addr, ufrag, fingerprint)
	require.NoError(t, err)
	require.Equal(t, expectedServerSDP, sdp)
}

const expectedClientSDP = `v=0
o=- 0 0 IN IP4 0.0.0.0
s=-
c=IN IP4 0.0.0.0
t=0 0

m=application 37826 UDP/DTLS/SCTP webrtc-datachannel
a=mid:0
a=ice-options:ice2
a=ice-ufrag:d2c0fc07-8bb3-42ae-bae2-a6fce8a0b581
a=ice-pwd:d2c0fc07-8bb3-42ae-bae2-a6fce8a0b581
a=fingerprint:sha-256 ba:78:16:bf:8f:01:cf:ea:41:41:40:de:5d:ae:22:23:b0:03:61:a3:96:17:7a:9c:b4:10:ff:61:f2:00:15:ad
a=setup:actpass
a=sctp-port:5000
a=max-message-size:16384
`

func TestRenderClientSDP(t *testing.T) {
	addr := &net.UDPAddr{IP: net.IPv4(0, 0, 0, 0), Port: 37826}
	ufrag := "d2c0fc07-8bb3-42ae-bae2-a6fce8a0b581"
	sdp := createClientSDP(addr, ufrag)
	require.Equal(t, expectedClientSDP, sdp)
}

func BenchmarkRenderClientSDP(b *testing.B) {
	addr := &net.UDPAddr{IP: net.IPv4(0, 0, 0, 0), Port: 37826}
	ufrag := "d2c0fc07-8bb3-42ae-bae2-a6fce8a0b581"

	for i := 0; i < b.N; i++ {
		createClientSDP(addr, ufrag)
	}
}

func BenchmarkRenderServerSDP(b *testing.B) {
	encoded, _ := hex.DecodeString("ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad")

	testMultihash := multihash.DecodedMultihash{
		Code:   multihash.SHA2_256,
		Name:   multihash.Codes[multihash.SHA2_256],
		Digest: encoded,
		Length: len(encoded),
	}
	addr := &net.UDPAddr{IP: net.IPv4(0, 0, 0, 0), Port: 37826}
	ufrag := "d2c0fc07-8bb3-42ae-bae2-a6fce8a0b581"
	fingerprint := testMultihash

	for i := 0; i < b.N; i++ {
		createServerSDP(addr, ufrag, fingerprint)
	}

}