package main

import (
	"bytes";
	"encoding/binary";
	"flag";
	"fmt";
	"net";
	"os";
	"./build/msg/msg"
)

const (
	defaultServer = "127.0.0.1:7777";
	defaultName = "tester";
	defaultData = "Das ist ein Test"
)

var serverAddr *string = flag.String("s", defaultServer, "server:port to connect to")
var name *string = flag.String("n", defaultName, "nickname to send to server")
var data *string = flag.String("d", defaultData, "message to send to server")

func talker(conn *net.TCPConn) {
	message := new(msg.Message)
	message.SetSender(*name)
	message.SetData(*data)

	bytebuf := make([]byte, 0, message.SenderLen + message.DataLen + 8)
	buf := bytes.NewBuffer(bytebuf)

	if e := binary.Write(buf, binary.LittleEndian, message.SenderLen); e != nil {
		fmt.Fprintf(os.Stderr, "Error: %v\n", e)
	}
	if num, _ := buf.WriteString(message.GetSender()); uint32(num) != message.SenderLen {
		fmt.Fprintf(os.Stderr, "Error: %d != %d\n", num, message.SenderLen)
	}
	if e := binary.Write(buf, binary.LittleEndian, message.DataLen); e != nil {
		fmt.Fprintf(os.Stderr, "Error: %v\n", e)
	}
	if num, _ := buf.WriteString(message.GetData()); uint32(num) != message.DataLen {
		fmt.Fprintf(os.Stderr, "Error: %d != %d\n", num, message.DataLen)
	}


	if num, e := conn.Write(buf.Bytes()); num < 0 {
		fmt.Fprintf(os.Stderr, "Error: %v\n", e)
	}
}

func main() {
	flag.Parse()

	socket, e := net.ResolveTCPAddr(*serverAddr)
	if e != nil {
		fmt.Fprintf(os.Stderr, "Error: %v\n", e)
		os.Exit(1)
	}
	conn, e := net.DialTCP("tcp4", nil, socket)
	if e != nil {
		fmt.Fprintf(os.Stderr, "Error: %v\n", e)
		os.Exit(1)
	}

	talker(conn)

	conn.Close()
}

