#!/bin/python
import argparse
import sys
import io
import struct
import logging
import pprint
import json

import zmq

import blueox.client

DEFAULT_HOST = "127.0.0.1:3513"

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

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 print_pretty_header(entity):
    print
    try:
        duration = (entity['end'] - entity['start'])
        if duration < 2:
            duration_str = "%d ms" % round(duration * 1000)
        else:
            duration_str = "%.1f s" % duration

        print "=== %s (%s@%s:%s)  (%s)" % (entity['type'], entity['id'][:12], entity['host'], entity['pid'], duration_str)
    except KeyError:
        print "=== %s (%s)" % (entity['type'], entity['id'])


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--verbose', '-v', dest='verbose', action='append_const', const=True, default=list())

    parser.add_argument('--type-name', '-n', dest='type_name', action='store', default=None, help="What event types to display. Can end with '*' for prefix matches.")
    parser.add_argument('--host', '-H', dest='host', action='store', default=None)
    parser.add_argument('--log-path', '-l', dest='log_path', action='store', default=None)
    parser.add_argument('--pretty', '-p', dest='pretty', action='store_true', default=False)
    parser.add_argument('--group', dest='group', action='store_true', default=False)
    parser.add_argument('--json', '-j', dest='json', action='store_true', default=False)

    options = parser.parse_args()

    setup_logging(options)

    # We don't want to rely just on isatty because managed environments like
    # upstart might not give you a tty either.
    if sys.stdin.isatty() or options.host:
        log.info("Loading stream from oxd")

        if options.host:
            host = options.host
        else:
            host = DEFAULT_HOST

        out_stream = blueox.client.subscribe_stream(host, options.type_name)
    else:
        if options.type_name is not None:
            parser.error("Can't specify a name from stdin")
            sys.exit(1)

        log.info("Loading stream from stdin")
        out_stream = blueox.client.stdin_stream()

    if options.group:
        out_stream = blueox.client.Grouper(out_stream)

    for line in out_stream:
        if options.json:
            if options.pretty:
                print_pretty_header(line)
                print json.dumps(line, sort_keys=True, indent=4, separators=(',', ': '))
            else:
                print json.dumps(line)
        elif options.pretty:
            print_pretty_header(line)
            pprint.pprint(line['body'])
        else:
            print line


if __name__ == '__main__':
    try:
        main()
    except (KeyboardInterrupt, SystemExit):
        pass
