package main

import (
"reflect"
//"./timer"
"time"
"fmt"
"strings"
"regexp"
"io/ioutil"
"encoding/hex"
)


var tcp_data string = read_tcp_file("/proc/net/tcp")

func main() {
	var loops int	= 0
	// How to split on space-delimited fields, then colon-delimited fields?
	// How to turn this byte into a string?

	// /proc/net/tcp hex addresses need to be reversed two-character-wise
	// and then converted byte by byte (2 char at a time)
	//fmt.Println(convert_address(reverse_string(reverse_bytes("0100007F"))))

	for _ = range time.Tick(10 * time.Second) {
		fmt.Println("Waiting 10 seconds...")
		for num, row := range get_tcp_rows(tcp_data) {
			row_type	:= reflect.TypeOf(row)
			fmt.Println(num, " ", row_type)
		}
	// if loops modulo 6 (1min) then
	// 	for address in address_list do
	//		if (grep address address_list | wc -l >=3) then
	//			This is a port scan!
	//		fi
	//	done
	// elseif (wc -l old_tcp_file > wc -l tcp_file) then
	//	for i in (wc -l tcp_file - wc -l old_tcp_flle) do
	//		print New Connection! reverse_strng(reverse_bytes(tcp_file[i])) // This oversimplifies row value selection for the sake
	//										// of pseudocode
	//	done
	// else
	//	"No new connections. Waiting another 10 seconds..."
	// fi
		loops++
	}
}

func check(e error) {
    if e != nil {
        panic(e)
    }
}

// Aiming for an array of [string]string maps
// Am I looking for a map[string]interface here?
func get_tcp_rows(connections_file string) []string {
	tcp_lines		:= strings.Split(connections_file, "\n")
	regexpression		:= regexp.MustCompile(`[\r\n\t\f\v]+`)
	tcp_columns		:= regexpression.Split(tcp_lines[0], -1)
	var tcp_values map[string]string

	for i, line	:= range tcp_lines[1:] {
		trim_line			:= strings.TrimSpace(line)
		values				:= regexpression.Split(trim_line, -1)
		column				:= tcp_columns[i]
		tcp_values[column]		= values
	}
	return tcp_values
}

// Take a string, create a rune slice, and use a loop to reverse it character-wise.
func reverse_bytes(s string) string {
    runes := []rune(s)
    for i, j := len(runes)-2, len(runes)-1; j > 0; i, j = i-2, j-2 {
        runes[i], runes[j] = runes[j], runes[i]
    }
    return string(runes)
}

func reverse_string(s string) string {
    runes := []rune(s)
    for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
        runes[i], runes[j] = runes[j], runes[i]
    }
    return string(runes)
}
// Store data function
//	Loads all fields and subfields into storage (memory? where?)
// State check function
//	hash each line, use to determine new lines, convert to readable, and print


func convert_address(address string) []byte {
	output, err	:= hex.DecodeString(address)
	check(err)
	return output
}
func read_tcp_file(connections_file_path string) string {
	data, err := ioutil.ReadFile(connections_file_path)
	check(err)
	fmt.Println("Data file read successfully.\n")
	return string(data)
}
