// inspired from:
// https://github.com/mactsouk/opensource.com.git
// and
// https://coderwall.com/p/wohavg/creating-a-simple-tcp-server-in-go

package main

// import "fmt"
// import "os"

import "math/rand"
import "net"
import "time"
import "log"

// will try to get this hosts FQDN
import "github.com/Showmax/go-fqdn"

// this is the king of dns libraries
import "github.com/miekg/dns"

// this is awesome for debugging
import "github.com/davecgh/go-spew/spew"

// this is our dnssec IPv6 socket library
import "git.wit.com/jcarr/dnssecsocket"

const (
	CONN_HOST = "localhost"
	CONN_PORT = "3333"
	CONN_TYPE = "tcp"
)

/*
go func(c net.Conn) {
	defer c.Close()
	io.Copy(os.Stdout, c)
}(conn)
*/

func main() {
	// redirect all this output to systemd
	dnssecsocket.UseJournalctl()

	hostname := fqdn.Get()
	log.Println("FQDN hostname is", hostname)

	// lookup the IP address from DNS
	dnsRR := dnssecsocket.Dnstrace(hostname, "AAAA")
	spew.Dump(dnsRR)
	ipaddr := dns.Field(dnsRR, 1)
	log.Println("ipaddr", ipaddr)

	listenstr :=  "[" + ipaddr + "]:" + CONN_PORT
	log.Println("listenstr", listenstr)

	myTCPAddr, err := net.ResolveTCPAddr("tcp", listenstr)

	// // Listen for incoming connections on the IPv6 address only
	l, err := net.ListenTCP("tcp", myTCPAddr)
	if err != nil {
		log.Println("Error listening:", err.Error())
		return
	}

	// Close the listener when the application closes.
	defer l.Close()

	log.Println("Listening on " + listenstr)

	rand.Seed(time.Now().Unix())

	for {
		// Listen for an incoming connection.
		conn, err := l.AcceptTCP()
		if err != nil {
			log.Println("Error accepting: ", err.Error())
			return
		}

		log.Println("Accepted new connection from: " + conn.RemoteAddr().String())

		// Handle connections in a new goroutine.
		go dnssecsocket.HandleConnection(conn)
	}
}