package main

import "log"
import "os"
import "time"
import "net"
import "fmt"
import "bufio"

import "git.wit.com/wit/shell"
import "git.wit.com/jcarr/dnssecsocket"

var socketAlive bool = false
var connCurrent *net.TCPConn

const (
	CONN_HOST = "v000185.testing.com.customers.wprod.wit.com"
	CONN_PORT = "3333"
	CONN_PROTO = "tcp"
)

func writelnToSocket(aline string) {
	if connCurrent == nil {
		log.Println("SOCKET IS NOT CONNECTED")
		return
	}

	// a, err := connCurrent.Write([]byte(string(text + "\n")))
	a, err := connCurrent.Write([]byte(string(aline + "\n")))
	if err != nil {
		log.Println("SOCKET WRITE FAILED with err=", err, a)
		connCurrent = nil
		return
	}
}

func writeBytesToSocket(data []byte) {
	if (connCurrent == nil) {
		log.Println("WIT Socket is currently down (connCurrent == nil)")
		return
	}
	a, err := connCurrent.Write(data)
	log.Println("WIT Socket Write() returned:", a, err)
}

func socketToWIT(myhostname string) {
	remoteAddr :=  CONN_HOST + ":" + CONN_PORT
	log.Println("remoteAddr:", remoteAddr)

	localTCPAddr := dnssecsocket.ResolveIPv6hostname(myhostname)
	remoteTCPAddr, err := net.ResolveTCPAddr("tcp", remoteAddr)

	// connect to this socket
	conn, err := net.DialTCP(CONN_PROTO, localTCPAddr, remoteTCPAddr)

	if err != nil {
		log.Println(CONN_HOST, CONN_PORT, CONN_PROTO)
		log.Println(err)
		log.Println("socket connect failed. Not sure what to do here. os.Exit() ?")
		connCurrent = nil
		return
	}
	defer conn.Close()

	log.Println("socket connected to", CONN_PROTO, CONN_HOST, CONN_PORT)

	tmp, err := conn.Write([]byte(string(myhostname + "\n")))
	log.Println("conn.Write:", tmp, err)

	if (err != nil) {
		fmt.Println("SOCKET DIED with err=", err)
		connCurrent = nil
		return
	}

	connStdin, err := conn.File()

	if (err != nil) {
		fmt.Println("SOCKET File() failed with err=", err)
		connCurrent = nil
		return
	}

	// set the socketAlive flag to true since the socket appears to be alive
	socketAlive = true
	connCurrent = conn

	newreader := bufio.NewReader(connStdin)

	shell.NonBlockingReader(newreader, os.Stdout)
}

func retrySocket() {
	for {
		log.Println("Sleep for 3 seconds, then try to establish connection to WIT")
		time.Sleep(3 * 1000 * 1000 * 1000)

		// for now, loop until I figure out what to actually do
		socketToWIT("librem15.lab.wit.com")
	}
}