func main() {
	i, err := strconv.Atoi(os.Args[1])
	checkError(err)
	bftsmartclient.CreateServiceProxy(i, os.Args[2])
	var text string
	fmt.Println("acao(add,remove,size,contains,get,sair) :")
	_, err = fmt.Scanln(&text)
	checkError(err)
	fmt.Println(text)
	fmt.Println("iniciando switch")
	for text != "sair" {
		fmt.Println("dentro switch")
		switch text {
		case "add":
			req := new(bftbench.Request)
			act := bftbench.Request_ADD
			req.Action = &act
			fmt.Println("value : ")
			fmt.Scanln(text)
			i, err := strconv.Atoi(text)
			i32 := int32(i)
			checkError(err)
			req.Value = &i32
			data, err := proto.Marshal(req)
			checkError(err)
			respd := bftsmartclient.InvokeOrdered(data)
			rsp := new(bftbench.Response)
			err = proto.Unmarshal(respd, rsp)
			fmt.Println(rsp.GetBoolResponse())
		case "remove":
			req := new(bftbench.Request)
			act := bftbench.Request_REMOVE
			req.Action = &act
			fmt.Println("value : ")
			fmt.Scanln(text)
			i, err := strconv.Atoi(text)
			i32 := int32(i)
			checkError(err)
			req.Value = &i32
			data, err := proto.Marshal(req)
			checkError(err)
			respd := bftsmartclient.InvokeOrdered(data)
			rsp := new(bftbench.Response)
			err = proto.Unmarshal(respd, rsp)
			fmt.Println(rsp.GetBoolResponse())
		case "size":
			fmt.Println("executando size.")
			req := new(bftbench.Request)
			act := bftbench.Request_SIZE
			req.Action = &act
			data, err := proto.Marshal(req)
			checkError(err)
			fmt.Println("invoke ordered size")
			respd := bftsmartclient.InvokeOrdered(data)
			fmt.Println("invoke ordered finalizado")
			rsp := new(bftbench.Response)
			err = proto.Unmarshal(respd, rsp)
			fmt.Println(rsp.GetIntResponse())
		case "contains":
			req := new(bftbench.Request)
			act := bftbench.Request_CONTAINS
			req.Action = &act
			fmt.Println("value : ")
			fmt.Scanln(text)
			i, err := strconv.Atoi(text)
			i32 := int32(i)
			checkError(err)
			req.Value = &i32
			data, err := proto.Marshal(req)
			checkError(err)
			respd := bftsmartclient.InvokeOrdered(data)
			rsp := new(bftbench.Response)
			err = proto.Unmarshal(respd, rsp)
			fmt.Println(rsp.GetBoolResponse())
		case "get":
			req := new(bftbench.Request)
			act := bftbench.Request_GET
			req.Action = &act
			fmt.Println("value : ")
			fmt.Scanln(text)
			i, err := strconv.Atoi(text)
			i32 := int32(i)
			checkError(err)
			req.Value = &i32
			data, err := proto.Marshal(req)
			checkError(err)
			respd := bftsmartclient.InvokeOrdered(data)
			rsp := new(bftbench.Response)
			err = proto.Unmarshal(respd, rsp)
			fmt.Println(rsp.GetIntResponse())
		}
		fmt.Println("acao(add,remove,size,contains,get,sair) :")
		_, err = fmt.Scanln(&text)
		checkError(err)
	}
	fmt.Println("fim.")
	bftsmartclient.FinalizarJvm()
}
func (r replica) execute(command []byte) []byte {
	req := new(bftbench.Request)
	err := proto.Unmarshal(command, req)
	checkError(err)
	var res bool
	var achou bool
	rsp := new(bftbench.Response)

	if req.GetAction() == bftbench.Request_ADD {
		val := req.GetValue()
		res = false
		achou = false
		for _, element := range r.state {
			if element == val {
				achou = true
				break
			}
		}
		if achou == false {
			r.state = append(r.state, val)
			res = true
		}
		rsp.BoolResponse = &res
		data, err := proto.Marshal(rsp)
		checkError(err)
		return data
	} else if req.GetAction() == bftbench.Request_GET {
		val := req.GetValue()
		if val >= int32(len(r.state)) {
			val = -1
		} else {
			val = r.state[val]
		}
		rsp.IntResponse = &val
		data, err := proto.Marshal(rsp)
		checkError(err)
		return data
	} else if req.GetAction() == bftbench.Request_REMOVE {
		val := req.GetValue()
		res = false
		achou = false
		for index, element := range r.state {
			if element == val {
				achou = true
				val = int32(index)
				break
			}
		}
		if achou == true {
			r.state = append(r.state[:val], r.state[val+1:]...)
			res = true
		}
		rsp.BoolResponse = &res
		data, err := proto.Marshal(rsp)
		checkError(err)
		return data
	} else if req.GetAction() == bftbench.Request_SIZE {
		val := int32(len(r.state))
		rsp.IntResponse = &val
		data, err := proto.Marshal(rsp)
		checkError(err)
		return data
	} else { // contains
		val := req.GetValue()
		res = false
		achou = false
		for _, element := range r.state {
			if element == val {
				achou = true
				break
			}
		}
		if achou == true {
			res = true
		}
		rsp.BoolResponse = &res
		data, err := proto.Marshal(rsp)
		checkError(err)
		return data
	}
}