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

package main

import (
	"AgentVsAgent"
	"flag"
	"fmt"
	"git.apache.org/thrift.git/lib/go/thrift"
	"math"
	"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, "  EntryResponse enter_arena(EntryRequest request)")
	fmt.Fprintln(os.Stderr, "  GameInfo get_game_info(Ticket ticket)")
	fmt.Fprintln(os.Stderr, "   get_hand(Ticket ticket)")
	fmt.Fprintln(os.Stderr, "   pass_cards(Ticket ticket,  cards)")
	fmt.Fprintln(os.Stderr, "  Trick get_trick(Ticket ticket)")
	fmt.Fprintln(os.Stderr, "  Trick play_card(Ticket ticket, Card card)")
	fmt.Fprintln(os.Stderr, "  RoundResult get_round_result(Ticket ticket)")
	fmt.Fprintln(os.Stderr, "  GameResult get_game_result(Ticket ticket)")
	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
	_ = math.MinInt32 // will become unneeded eventually
	_ = strconv.Atoi
	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 := AgentVsAgent.NewHeartsClientFactory(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 "enter_arena":
		if flag.NArg()-1 != 1 {
			fmt.Fprintln(os.Stderr, "EnterArena requires 1 args")
			flag.Usage()
		}
		arg38 := flag.Arg(1)
		mbTrans39 := thrift.NewTMemoryBufferLen(len(arg38))
		defer mbTrans39.Close()
		_, err40 := mbTrans39.WriteString(arg38)
		if err40 != nil {
			Usage()
			return
		}
		factory41 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt42 := factory41.GetProtocol(mbTrans39)
		argvalue0 := AgentVsAgent.NewEntryRequest()
		err43 := argvalue0.Read(jsProt42)
		if err43 != nil {
			Usage()
			return
		}
		value0 := argvalue0
		fmt.Print(client.EnterArena(value0))
		fmt.Print("\n")
		break
	case "get_game_info":
		if flag.NArg()-1 != 1 {
			fmt.Fprintln(os.Stderr, "GetGameInfo requires 1 args")
			flag.Usage()
		}
		arg44 := flag.Arg(1)
		mbTrans45 := thrift.NewTMemoryBufferLen(len(arg44))
		defer mbTrans45.Close()
		_, err46 := mbTrans45.WriteString(arg44)
		if err46 != nil {
			Usage()
			return
		}
		factory47 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt48 := factory47.GetProtocol(mbTrans45)
		argvalue0 := AgentVsAgent.NewTicket()
		err49 := argvalue0.Read(jsProt48)
		if err49 != nil {
			Usage()
			return
		}
		value0 := argvalue0
		fmt.Print(client.GetGameInfo(value0))
		fmt.Print("\n")
		break
	case "get_hand":
		if flag.NArg()-1 != 1 {
			fmt.Fprintln(os.Stderr, "GetHand requires 1 args")
			flag.Usage()
		}
		arg50 := flag.Arg(1)
		mbTrans51 := thrift.NewTMemoryBufferLen(len(arg50))
		defer mbTrans51.Close()
		_, err52 := mbTrans51.WriteString(arg50)
		if err52 != nil {
			Usage()
			return
		}
		factory53 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt54 := factory53.GetProtocol(mbTrans51)
		argvalue0 := AgentVsAgent.NewTicket()
		err55 := argvalue0.Read(jsProt54)
		if err55 != nil {
			Usage()
			return
		}
		value0 := argvalue0
		fmt.Print(client.GetHand(value0))
		fmt.Print("\n")
		break
	case "pass_cards":
		if flag.NArg()-1 != 2 {
			fmt.Fprintln(os.Stderr, "PassCards requires 2 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)
		argvalue0 := AgentVsAgent.NewTicket()
		err61 := argvalue0.Read(jsProt60)
		if err61 != nil {
			Usage()
			return
		}
		value0 := argvalue0
		arg62 := flag.Arg(2)
		mbTrans63 := thrift.NewTMemoryBufferLen(len(arg62))
		defer mbTrans63.Close()
		_, err64 := mbTrans63.WriteString(arg62)
		if err64 != nil {
			Usage()
			return
		}
		factory65 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt66 := factory65.GetProtocol(mbTrans63)
		containerStruct1 := AgentVsAgent.NewPassCardsArgs()
		err67 := containerStruct1.ReadField2(jsProt66)
		if err67 != nil {
			Usage()
			return
		}
		argvalue1 := containerStruct1.Cards
		value1 := argvalue1
		fmt.Print(client.PassCards(value0, value1))
		fmt.Print("\n")
		break
	case "get_trick":
		if flag.NArg()-1 != 1 {
			fmt.Fprintln(os.Stderr, "GetTrick requires 1 args")
			flag.Usage()
		}
		arg68 := flag.Arg(1)
		mbTrans69 := thrift.NewTMemoryBufferLen(len(arg68))
		defer mbTrans69.Close()
		_, err70 := mbTrans69.WriteString(arg68)
		if err70 != nil {
			Usage()
			return
		}
		factory71 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt72 := factory71.GetProtocol(mbTrans69)
		argvalue0 := AgentVsAgent.NewTicket()
		err73 := argvalue0.Read(jsProt72)
		if err73 != nil {
			Usage()
			return
		}
		value0 := argvalue0
		fmt.Print(client.GetTrick(value0))
		fmt.Print("\n")
		break
	case "play_card":
		if flag.NArg()-1 != 2 {
			fmt.Fprintln(os.Stderr, "PlayCard requires 2 args")
			flag.Usage()
		}
		arg74 := flag.Arg(1)
		mbTrans75 := thrift.NewTMemoryBufferLen(len(arg74))
		defer mbTrans75.Close()
		_, err76 := mbTrans75.WriteString(arg74)
		if err76 != nil {
			Usage()
			return
		}
		factory77 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt78 := factory77.GetProtocol(mbTrans75)
		argvalue0 := AgentVsAgent.NewTicket()
		err79 := argvalue0.Read(jsProt78)
		if err79 != nil {
			Usage()
			return
		}
		value0 := argvalue0
		arg80 := flag.Arg(2)
		mbTrans81 := thrift.NewTMemoryBufferLen(len(arg80))
		defer mbTrans81.Close()
		_, err82 := mbTrans81.WriteString(arg80)
		if err82 != nil {
			Usage()
			return
		}
		factory83 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt84 := factory83.GetProtocol(mbTrans81)
		argvalue1 := AgentVsAgent.NewCard()
		err85 := argvalue1.Read(jsProt84)
		if err85 != nil {
			Usage()
			return
		}
		value1 := argvalue1
		fmt.Print(client.PlayCard(value0, value1))
		fmt.Print("\n")
		break
	case "get_round_result":
		if flag.NArg()-1 != 1 {
			fmt.Fprintln(os.Stderr, "GetRoundResult requires 1 args")
			flag.Usage()
		}
		arg86 := flag.Arg(1)
		mbTrans87 := thrift.NewTMemoryBufferLen(len(arg86))
		defer mbTrans87.Close()
		_, err88 := mbTrans87.WriteString(arg86)
		if err88 != nil {
			Usage()
			return
		}
		factory89 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt90 := factory89.GetProtocol(mbTrans87)
		argvalue0 := AgentVsAgent.NewTicket()
		err91 := argvalue0.Read(jsProt90)
		if err91 != nil {
			Usage()
			return
		}
		value0 := argvalue0
		fmt.Print(client.GetRoundResult(value0))
		fmt.Print("\n")
		break
	case "get_game_result":
		if flag.NArg()-1 != 1 {
			fmt.Fprintln(os.Stderr, "GetGameResult requires 1 args")
			flag.Usage()
		}
		arg92 := flag.Arg(1)
		mbTrans93 := thrift.NewTMemoryBufferLen(len(arg92))
		defer mbTrans93.Close()
		_, err94 := mbTrans93.WriteString(arg92)
		if err94 != nil {
			Usage()
			return
		}
		factory95 := thrift.NewTSimpleJSONProtocolFactory()
		jsProt96 := factory95.GetProtocol(mbTrans93)
		argvalue0 := AgentVsAgent.NewTicket()
		err97 := argvalue0.Read(jsProt96)
		if err97 != nil {
			Usage()
			return
		}
		value0 := argvalue0
		fmt.Print(client.GetGameResult(value0))
		fmt.Print("\n")
		break
	case "":
		Usage()
		break
	default:
		fmt.Fprintln(os.Stderr, "Invalid function ", cmd)
	}
}
