// 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 (
	"go.wit.com/shell"

	"go.wit.com/control-panel-dns/cloudflare"
	"go.wit.com/control-panel-dns/dnssecsocket"
)

// 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"


func getHostname() {
	var err error
	var s string = "gui.Label == nil"
	s, err = fqdn.FqdnHostname()
	if (err != nil) {
		debug(LogError, "FQDN hostname error =", err)
		return
	}
	if (me.fqdn != nil) {
		if (me.hostname != s) {
			me.fqdn.SetText(s)
			me.hostname = s
			me.changed = true
		}
	}
	debug(LogNet, "FQDN =", s)

	dn := run("domainname")
	if (me.domainname.S != dn) {
		debug(LogChange, "domainname has changed from", me.domainname.S, "to", dn)
		me.domainname.SetText(dn)
		me.changed = true
	}

	hshort := run("hostname -s")
	if (me.hostshort.S != hshort) {
		debug(LogChange, "hostname -s has changed from", me.hostshort.S, "to", hshort)
		me.hostshort.SetText(hshort)
		me.changed = true
	}

	var test string
	test = hshort + "." + dn
	if (me.hostname != test) {
		debug(LogInfo, "me.hostname", me.hostname, "does not equal", test)
		if (me.hostnameStatus.S != "BROKEN") {
			debug(LogChange, "me.hostname", me.hostname, "does not equal", test)
			me.changed = true
			me.hostnameStatus.SetText("BROKEN")
		}
	} else {
		if (me.hostnameStatus.S != "VALID") {
			debug(LogChange, "me.hostname", me.hostname, "is valid")
			me.hostnameStatus.SetText("VALID")
			me.changed = true
		}
		// enable the cloudflare button if the provider is cloudflare
		if (me.cloudflareB == nil) {
			debug(LogChange, "me.cloudflare == nil; me.DnsAPI.S =", me.DnsAPI.S)
			if (me.DnsAPI.S == "cloudflare") {
				me.cloudflareB = me.mainStatus.NewButton("cloudflare wit.com", func () {
					cloudflare.CreateRR(myGui, "wit.com", "3777302ac4a78cd7fa4f6d3f72086d06")
				})
			}
		}
	}
}

// returns true if the hostname is good
// check that all the OS settings are correct here
// On Linux, /etc/hosts, /etc/hostname
//      and domainname and hostname
func goodHostname(h string) bool {
	hostname := shell.Chomp(shell.Cat("/etc/hostname"))
	debug(true, "hostname =", hostname)

	hs := run("hostname -s")
	dn := run("domainname")
	debug(true, "hostname short =", hs, "domainname =", dn)

	tmp := hs + "." + dn
	if (hostname == tmp) {
		debug(true, "hostname seems to be good", hostname)
		return true
	}

	return false
}

func digAAAA(s string) []string {
	var aaaa []string
	// lookup the IP address from DNS
	rrset := dnssecsocket.Dnstrace(s, "AAAA")
	// debug(true, args.VerboseDNS, SPEW, rrset)
	for i, rr := range rrset {
		ipaddr := dns.Field(rr, 1)
		// how the hell do you detect a RRSIG	AAAA record here?
		if (ipaddr == "28") {
			continue
		}
		debug(LogNow, "r.Answer =", i, "rr =", rr, "ipaddr =", ipaddr)
		aaaa = append(aaaa, ipaddr)
		me.ipv6s[ipaddr] = rr
	}
	debug(true, args.VerboseDNS, "aaaa =", aaaa)
	return aaaa
}
