// Autogenerated by Thrift Compiler (0.9.2)
// DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING

package main

import (
	"flag"
	"fmt"
	"git.apache.org/thrift.git/lib/go/thrift"
	"math"
	"messageservice"
	"net"
	"net/url"
	"os"
	"strconv"
	"strings"
)

func Usage() {
	fmt.Fprintln(os.Stderr, "Usage of ", os.Args[0], " [-h host:port] [-u url] [-f[ramed]] function [arg1 [arg2...]]:")
	flag.PrintDefaults()
	fmt.Fprintln(os.Stderr, "\nFunctions:")
	fmt.Fprintln(os.Stderr, "  void online(UserId userId)")
	fmt.Fprintln(os.Stderr, "  void offline(UserId userId)")
	fmt.Fprintln(os.Stderr, "  void keepAlive(UserId userId)")
	fmt.Fprintln(os.Stderr, "  void sendMessage(UserId userId, i16 cmd, string message)")
	fmt.Fprintln(os.Stderr, "  void sendMessageToUserIdCollection(UserIdCollection userIdCollection, i16 cmd, string message)")
	fmt.Fprintln(os.Stderr, "   getUserOnlineStatus(UserIdCollection userIdCollection)")
	fmt.Fprintln(os.Stderr, "  void sendMessageWithOneOfflineMessage(UserIdCollection userIdCollection, i16 cmd, string message)")
	fmt.Fprintln(os.Stderr, "  void sendMessageToRoom(string nsp, string room, i16 cmd, string message)")
	fmt.Fprintln(os.Stderr)
	os.Exit(0)
}

func main() {
	flag.Usage = Usage
	var host string
	var port int
	var protocol string
	var urlString string
	var framed bool
	var useHttp bool
	var parsedUrl url.URL
	var trans thrift.TTransport
	_ = strconv.Atoi
	_ = math.Abs
	flag.Usage = Usage
	flag.StringVar(&host, "h", "localhost", "Specify host and port")
	flag.IntVar(&port, "p", 9090, "Specify port")
	flag.StringVar(&protocol, "P", "binary", "Specify the protocol (binary, compact, simplejson, json)")
	flag.StringVar(&urlString, "u", "", "Specify the url")
	flag.BoolVar(&framed, "framed", false, "Use framed transport")
	flag.BoolVar(&useHttp, "http", false, "Use http")
	flag.Parse()

	if len(urlString) > 0 {
		parsedUrl, err := url.Parse(urlString)
		if err != nil {
			fmt.Fprintln(os.Stderr, "Error parsing URL: ", err)
			flag.Usage()
		}
		host = parsedUrl.Host
		useHttp = len(parsedUrl.Scheme) <= 0 || parsedUrl.Scheme == "http"
	} else if useHttp {
		_, err := url.Parse(fmt.Sprint("http://", host, ":", port))
		if err != nil {
			fmt.Fprintln(os.Stderr, "Error parsing URL: ", err)
			flag.Usage()
		}
	}

	cmd := flag.Arg(0)
	var err error
	if useHttp {
		trans, err = thrift.NewTHttpClient(parsedUrl.String())
	} else {
		portStr := fmt.Sprint(port)
		if strings.Contains(host, ":") {
			host, portStr, err = net.SplitHostPort(host)
			if err != nil {
				fmt.Fprintln(os.Stderr, "error with host:", err)
				os.Exit(1)
			}
		}
		trans, err = thrift.NewTSocket(net.JoinHostPort(host, portStr))
		if err != nil {
			fmt.Fprintln(os.Stderr, "error resolving address:", err)
			os.Exit(1)
		}
		if framed {
			trans = thrift.NewTFramedTransport(trans)
		}
	}
	if err != nil {
		fmt.Fprintln(os.Stderr, "Error creating transport", err)
		os.Exit(1)
	}
	defer trans.Close()
	var protocolFactory thrift.TProtocolFactory
	switch protocol {
	case "compact":
		protocolFactory = thrift.NewTCompactProtocolFactory()
		break
	case "simplejson":
		protocolFactory = thrift.NewTSimpleJSONProtocolFactory()
		break
	case "json":
		protocolFactory = thrift.NewTJSONProtocolFactory()
		break
	case "binary", "":
		protocolFactory = thrift.NewTBinaryProtocolFactoryDefault()
		break
	default:
		fmt.Fprintln(os.Stderr, "Invalid protocol specified: ", protocol)
		Usage()
		os.Exit(1)
	}
	client := messageservice.NewMessageServiceClientFactory(trans, protocolFactory)
	if err := trans.Open(); err != nil {
		fmt.Fprintln(os.Stderr, "Error opening socket to ", host, ":", port, " ", err)
		os.Exit(1)
	}

	switch cmd {
	case "online":
		if flag.NArg()-1 != 1 {
			fmt.Fprintln(os.Stderr, "Online requires 1 args")
			flag.Usage()
		}
		arg22 := flag.Arg(1)
		mbTrans23 := thrift.NewTMemoryBufferLen(len(arg22))
		defer mbTrans23.Close()
		_, err24 := mbTrans23.WriteString(arg22)
		if err24 != nil {
			Usage()
			return
		}
		factory25 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt26 := factory25.GetProtocol(mbTrans23)
		argvalue0 := messageservice.NewUserId()
		err27 := argvalue0.Read(jsProt26)
		if err27 != nil {
			Usage()
			return
		}
		value0 := argvalue0
		fmt.Print(client.Online(value0))
		fmt.Print("\n")
		break
	case "offline":
		if flag.NArg()-1 != 1 {
			fmt.Fprintln(os.Stderr, "Offline requires 1 args")
			flag.Usage()
		}
		arg28 := flag.Arg(1)
		mbTrans29 := thrift.NewTMemoryBufferLen(len(arg28))
		defer mbTrans29.Close()
		_, err30 := mbTrans29.WriteString(arg28)
		if err30 != nil {
			Usage()
			return
		}
		factory31 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt32 := factory31.GetProtocol(mbTrans29)
		argvalue0 := messageservice.NewUserId()
		err33 := argvalue0.Read(jsProt32)
		if err33 != nil {
			Usage()
			return
		}
		value0 := argvalue0
		fmt.Print(client.Offline(value0))
		fmt.Print("\n")
		break
	case "keepAlive":
		if flag.NArg()-1 != 1 {
			fmt.Fprintln(os.Stderr, "KeepAlive requires 1 args")
			flag.Usage()
		}
		arg34 := flag.Arg(1)
		mbTrans35 := thrift.NewTMemoryBufferLen(len(arg34))
		defer mbTrans35.Close()
		_, err36 := mbTrans35.WriteString(arg34)
		if err36 != nil {
			Usage()
			return
		}
		factory37 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt38 := factory37.GetProtocol(mbTrans35)
		argvalue0 := messageservice.NewUserId()
		err39 := argvalue0.Read(jsProt38)
		if err39 != nil {
			Usage()
			return
		}
		value0 := argvalue0
		fmt.Print(client.KeepAlive(value0))
		fmt.Print("\n")
		break
	case "sendMessage":
		if flag.NArg()-1 != 3 {
			fmt.Fprintln(os.Stderr, "SendMessage requires 3 args")
			flag.Usage()
		}
		arg40 := flag.Arg(1)
		mbTrans41 := thrift.NewTMemoryBufferLen(len(arg40))
		defer mbTrans41.Close()
		_, err42 := mbTrans41.WriteString(arg40)
		if err42 != nil {
			Usage()
			return
		}
		factory43 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt44 := factory43.GetProtocol(mbTrans41)
		argvalue0 := messageservice.NewUserId()
		err45 := argvalue0.Read(jsProt44)
		if err45 != nil {
			Usage()
			return
		}
		value0 := argvalue0
		tmp1, err46 := (strconv.Atoi(flag.Arg(2)))
		if err46 != nil {
			Usage()
			return
		}
		argvalue1 := byte(tmp1)
		value1 := argvalue1
		argvalue2 := flag.Arg(3)
		value2 := argvalue2
		fmt.Print(client.SendMessage(value0, value1, value2))
		fmt.Print("\n")
		break
	case "sendMessageToUserIdCollection":
		if flag.NArg()-1 != 3 {
			fmt.Fprintln(os.Stderr, "SendMessageToUserIdCollection requires 3 args")
			flag.Usage()
		}
		arg48 := flag.Arg(1)
		mbTrans49 := thrift.NewTMemoryBufferLen(len(arg48))
		defer mbTrans49.Close()
		_, err50 := mbTrans49.WriteString(arg48)
		if err50 != nil {
			Usage()
			return
		}
		factory51 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt52 := factory51.GetProtocol(mbTrans49)
		containerStruct0 := messageservice.NewSendMessageToUserIdCollectionArgs()
		err53 := containerStruct0.ReadField1(jsProt52)
		if err53 != nil {
			Usage()
			return
		}
		argvalue0 := containerStruct0.UserIdCollection
		value0 := messageservice.UserIdCollection(argvalue0)
		tmp1, err54 := (strconv.Atoi(flag.Arg(2)))
		if err54 != nil {
			Usage()
			return
		}
		argvalue1 := byte(tmp1)
		value1 := argvalue1
		argvalue2 := flag.Arg(3)
		value2 := argvalue2
		fmt.Print(client.SendMessageToUserIdCollection(value0, value1, value2))
		fmt.Print("\n")
		break
	case "getUserOnlineStatus":
		if flag.NArg()-1 != 1 {
			fmt.Fprintln(os.Stderr, "GetUserOnlineStatus requires 1 args")
			flag.Usage()
		}
		arg56 := flag.Arg(1)
		mbTrans57 := thrift.NewTMemoryBufferLen(len(arg56))
		defer mbTrans57.Close()
		_, err58 := mbTrans57.WriteString(arg56)
		if err58 != nil {
			Usage()
			return
		}
		factory59 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt60 := factory59.GetProtocol(mbTrans57)
		containerStruct0 := messageservice.NewGetUserOnlineStatusArgs()
		err61 := containerStruct0.ReadField1(jsProt60)
		if err61 != nil {
			Usage()
			return
		}
		argvalue0 := containerStruct0.UserIdCollection
		value0 := messageservice.UserIdCollection(argvalue0)
		fmt.Print(client.GetUserOnlineStatus(value0))
		fmt.Print("\n")
		break
	case "sendMessageWithOneOfflineMessage":
		if flag.NArg()-1 != 3 {
			fmt.Fprintln(os.Stderr, "SendMessageWithOneOfflineMessage requires 3 args")
			flag.Usage()
		}
		arg62 := flag.Arg(1)
		mbTrans63 := thrift.NewTMemoryBufferLen(len(arg62))
		defer mbTrans63.Close()
		_, err64 := mbTrans63.WriteString(arg62)
		if err64 != nil {
			Usage()
			return
		}
		factory65 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt66 := factory65.GetProtocol(mbTrans63)
		containerStruct0 := messageservice.NewSendMessageWithOneOfflineMessageArgs()
		err67 := containerStruct0.ReadField1(jsProt66)
		if err67 != nil {
			Usage()
			return
		}
		argvalue0 := containerStruct0.UserIdCollection
		value0 := messageservice.UserIdCollection(argvalue0)
		tmp1, err68 := (strconv.Atoi(flag.Arg(2)))
		if err68 != nil {
			Usage()
			return
		}
		argvalue1 := byte(tmp1)
		value1 := argvalue1
		argvalue2 := flag.Arg(3)
		value2 := argvalue2
		fmt.Print(client.SendMessageWithOneOfflineMessage(value0, value1, value2))
		fmt.Print("\n")
		break
	case "sendMessageToRoom":
		if flag.NArg()-1 != 4 {
			fmt.Fprintln(os.Stderr, "SendMessageToRoom requires 4 args")
			flag.Usage()
		}
		argvalue0 := flag.Arg(1)
		value0 := argvalue0
		argvalue1 := flag.Arg(2)
		value1 := argvalue1
		tmp2, err72 := (strconv.Atoi(flag.Arg(3)))
		if err72 != nil {
			Usage()
			return
		}
		argvalue2 := byte(tmp2)
		value2 := argvalue2
		argvalue3 := flag.Arg(4)
		value3 := argvalue3
		fmt.Print(client.SendMessageToRoom(value0, value1, value2, value3))
		fmt.Print("\n")
		break
	case "":
		Usage()
		break
	default:
		fmt.Fprintln(os.Stderr, "Invalid function ", cmd)
	}
}
