#!/usr/bin/env python
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

import optparse, sys, traceback

try:
  from qpid_messaging import *
except:
  from qpid.messaging import *

parser = optparse.OptionParser(usage="usage: %prog [options] ADDRESS ...",
                               description="handle requests from the supplied address.")
parser.add_option("-b", "--broker", default="localhost",
                  help="connect to specified BROKER (default %default)")
parser.add_option("-r", "--reconnect", action="store_true",
                  help="enable auto reconnect")
parser.add_option("-i", "--reconnect-interval", type="float", default=3,
                  help="interval between reconnect attempts")
parser.add_option("-l", "--reconnect-limit", type="int", default=10,
                  help="maximum number of reconnect attempts")
parser.add_option("-v", dest="verbose", action="store_true",
                  help="enable logging")

opts, args = parser.parse_args()

if args:
  addr = args.pop(0)
else:
  parser.error("address is required")

conn = Connection(opts.broker,
                  reconnect=opts.reconnect,
                  reconnect_interval=opts.reconnect_interval,
                  reconnect_limit=opts.reconnect_limit)

try:
  conn.open()
  session  = conn.session()
  sender   = session.sender(addr)
  response_queue = "response-queue;{create:always}"
  receiver = session.receiver(response_queue)
  receiver.capacity = 10

  while True:
    cmdtype = None
    data = None
    input = raw_input("Type (eval/shell/exit, ENTER=shell):")
    if input != "exit":
      if input == "eval":
        cmdtype = input
        data = raw_input("Text to evaluate: ")
      elif input == "shell" or input == "":
        cmdtype = "shell"
        data = raw_input("Shell cmd: ")

      if cmdtype != None and data != "":
        msg = Message()
        msg.properties["type"] = cmdtype
        # TODO: fix this
        # msg.setProperty("type", cmdtype)
        msg.content = data
        msg.reply_to = response_queue
        try:
          sender.send(msg)
          response = receiver.fetch()
          print "Response:"
          print "%s" % response.content
          session.acknowledge(response)
        except SendError, e:
          print e
    else:
      break
  if sender is not None:
    sender.close()
  if receiver is not None:
    receiver.close()
except ReceiverError, e:
  print e
except KeyboardInterrupt:
  pass

conn.close()
