package swarm

import (
	"fmt"
	peer "github.com/jbenet/go-ipfs/peer"
	ma "github.com/jbenet/go-multiaddr"
	mh "github.com/jbenet/go-multihash"
	"net"
	"testing"
)

func setupPeer(id string, addr string) (*peer.Peer, error) {
	tcp, err := ma.NewMultiaddr(addr)
	if err != nil {
		return nil, err
	}

	mh, err := mh.FromHexString(id)
	if err != nil {
		return nil, err
	}

	p := &peer.Peer{ID: peer.ID(mh)}
	p.AddAddress(tcp)
	return p, nil
}

func echoListen(listener *net.TCPListener) {
	for {
		c, err := listener.Accept()
		if err == nil {
			fmt.Println("accepeted")
			go echo(c)
		}
	}
}

func echo(c net.Conn) {
	for {
		data := make([]byte, 1024)
		i, err := c.Read(data)
		if err != nil {
			fmt.Printf("error %v\n", err)
			return
		}
		_, err = c.Write(data[:i])
		if err != nil {
			fmt.Printf("error %v\n", err)
			return
		}
		fmt.Println("echoing", data[:i])
	}
}

func TestDial(t *testing.T) {

	listener, err := net.Listen("tcp", "127.0.0.1:1234")
	if err != nil {
		t.Fatal("error setting up listener", err)
	}
	go echoListen(listener.(*net.TCPListener))

	p, err := setupPeer("11140beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33", "/ip4/127.0.0.1/tcp/1234")
	if err != nil {
		t.Fatal("error setting up peer", err)
	}

	c, err := Dial("tcp", p)
	if err != nil {
		t.Fatal("error dialing peer", err)
	}

	fmt.Println("sending")
	c.Outgoing.MsgChan <- []byte("beep")
	c.Outgoing.MsgChan <- []byte("boop")
	out := <-c.Incoming.MsgChan
	fmt.Println("recving", string(out))
	if string(out) != "beep" {
		t.Error("unexpected conn output")
	}

	out = <-c.Incoming.MsgChan
	if string(out) != "boop" {
		t.Error("unexpected conn output")
	}

	fmt.Println("closing")
	c.Close()
	listener.Close()
}