package server

import (
	"fmt"
	"io/ioutil"
	"net"
	"os"
	"testing"

	"github.com/cosmos/cosmos-sdk/client/flags"

	"github.com/spf13/viper"
	"github.com/stretchr/testify/require"
)

// Get a free address for a test tendermint server
// protocol is either tcp, http, etc
func FreeTCPAddr() (addr, port string, err error) {
	l, err := net.Listen("tcp", "localhost:0")
	if err != nil {
		return "", "", err
	}

	closer := func() {
		err := l.Close()
		if err != nil {
			// TODO: Handle with #870
			panic(err)
		}
	}

	defer closer()

	portI := l.Addr().(*net.TCPAddr).Port
	port = fmt.Sprintf("%d", portI)
	addr = fmt.Sprintf("tcp://0.0.0.0:%s", port)
	return
}

// SetupViper creates a homedir to run inside,
// and returns a cleanup function to defer
func SetupViper(t *testing.T) func() {
	rootDir, err := ioutil.TempDir("", "mock-sdk-cmd")
	require.Nil(t, err)
	viper.Set(flags.FlagHome, rootDir)
	viper.Set(flags.FlagName, "moniker")
	return func() {
		err := os.RemoveAll(rootDir)
		if err != nil {
			// TODO: Handle with #870
			panic(err)
		}
	}
}

// DONTCOVER
