#!/bin/python
import argparse
import datetime
import sys
import time
import logging

import zmq
import msgpack
import json

import blueox.client

log = logging.getLogger('blueox.ctl')


def setup_logging(options):
    if len(options.verbose) > 1:
        level = logging.DEBUG
    elif options.verbose:
        level = logging.INFO
    else:
        level = logging.WARNING

    log_format = "%(asctime)s %(levelname)s:%(name)s: %(message)s"
    logging.basicConfig(level=level, format=log_format, stream=sys.stdout)


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--verbose', '-v',
                        dest='verbose',
                        action='append_const',
                        const=True,
                        default=list())
    parser.add_argument('--host', '-H',
                        dest='host',
                        action='store',
                        default=blueox.client.default_host())
    parser.add_argument('--raw', '-r',
                        dest='raw',
                        action='store_true',
                        default=False)

    options = parser.parse_args()

    setup_logging(options)

    context = zmq.Context()
    poller = zmq.Poller()
    sock = context.socket(zmq.REQ)

    host = blueox.client.default_host(options.host)
    sock.connect("tcp://" + host)
    poller.register(sock, zmq.POLLIN)

    sock.send(msgpack.packb({'cmd': 'STATUS'}))

    result = dict(poller.poll(5000))
    if sock in result:
        resp = msgpack.unpackb(sock.recv())
        if options.raw:
            print json.dumps(resp)
        else:
            print "Host: %s" % options.host
            if resp.get('last'):
                print "Last: %s (%d secs ago)" % (
                    datetime.datetime.fromtimestamp(resp['last']),
                    time.time() - resp['last'])
            if resp.get('lag'):
                print "Lag: %f secs" % resp['lag']

            print
            for name, name_data in resp['hosts'].iteritems():
                print "  %32s  Last %s (%d secs ago)" % (
                    name, datetime.datetime.fromtimestamp(name_data['last']),
                    time.time() - name_data['last'])
            print
            for name, name_data in resp['events'].iteritems():
                print "  %32s  Last %s (%d secs ago)" % (
                    name, datetime.datetime.fromtimestamp(name_data['last']),
                    time.time() - name_data['last'])
    else:
        print >> sys.stderr, "Error connecting to server"
        sys.exit(1)


if __name__ == "__main__":
    main()
