package node

import (
	"net"
	"testing"

	"github.com/ethereum/go-ethereum/accounts"
	"github.com/ethereum/go-ethereum/crypto"
	"github.com/ethereum/go-ethereum/p2p/enode"
	"github.com/status-im/status-go/params"
	"github.com/status-im/status-go/t/utils"
	"github.com/stretchr/testify/require"
	"github.com/syndtr/goleveldb/leveldb"
	"github.com/syndtr/goleveldb/leveldb/storage"
)

var enode1 = "enode://f32efef2739e5135a0f9a80600b321ba4d13393a5f1d3f5f593df85919262f06c70bfa66d38507b9d79a91021f5e200ec20150592e72934c66248e87014c4317@1.1.1.1:30404"
var enode2 = "enode://f32efef2739e5135a0f9a80600b321ba4d13393a5f1d3f5f593df85919262f06c70bfa66d38507b9d79a91021f5e200ec20150592e72934c66248e87014c4317@1.1.1.1:30404"

func TestMakeNodeDefaultConfig(t *testing.T) {
	utils.Init()
	config, err := utils.MakeTestNodeConfig(3)
	require.NoError(t, err)

	db, err := leveldb.Open(storage.NewMemStorage(), nil)
	require.NoError(t, err)

	_, err = MakeNode(config, &accounts.Manager{}, db)
	require.NoError(t, err)
}

func TestMakeNodeWellFormedBootnodes(t *testing.T) {
	utils.Init()
	config, err := utils.MakeTestNodeConfig(3)
	require.NoError(t, err)

	bootnodes := []string{
		enode1,
		enode2,
	}
	config.ClusterConfig.BootNodes = bootnodes

	db, err := leveldb.Open(storage.NewMemStorage(), nil)
	require.NoError(t, err)

	_, err = MakeNode(config, &accounts.Manager{}, db)
	require.NoError(t, err)
}

func TestMakeNodeMalformedBootnodes(t *testing.T) {
	utils.Init()
	config, err := utils.MakeTestNodeConfig(3)
	require.NoError(t, err)

	bootnodes := []string{
		enode1,
		enode2,
		"enode://badkey@3.3.3.3:30303",
	}
	config.ClusterConfig.BootNodes = bootnodes

	db, err := leveldb.Open(storage.NewMemStorage(), nil)
	require.NoError(t, err)

	_, err = MakeNode(config, &accounts.Manager{}, db)
	require.NoError(t, err)
}

func TestParseNodesToNodeID(t *testing.T) {
	identity, err := crypto.GenerateKey()
	require.NoError(t, err)
	node := enode.NewV4(&identity.PublicKey, net.IP{10, 10, 10, 10}, 10, 20)
	nodeIDs := parseNodesToNodeID([]string{
		"enode://badkey@127.0.0.1:30303",
		node.String(),
	})
	require.Len(t, nodeIDs, 1)
	require.Equal(t, node.ID(), nodeIDs[0])
}

func TestNewGethNodeConfig(t *testing.T) {
	config, err := params.NewNodeConfig("", params.RopstenNetworkID)
	require.NoError(t, err)
	config.HTTPEnabled = true
	config.HTTPVirtualHosts = []string{"my.domain.com"}
	config.HTTPCors = []string{"http://my.domain.com"}

	nc, err := newGethNodeConfig(config)
	require.NoError(t, err)
	require.Equal(t, []string{"my.domain.com"}, nc.HTTPVirtualHosts)
	require.Equal(t, []string{"http://my.domain.com"}, nc.HTTPCors)
}