#!/usr/bin/env python
"""
    Author: John E. Vincent
	Email:	lusis.org+github.com@gmail.com
"""
import argparse
import sys

import vogeler.persistence as engine
from vogeler.server import VogelerServer
from vogeler.exceptions import VogelerServerException

def setup(pargs):
    pass

def process_message(message):
    try:
        response = message
        syskey = message['syskey']
        message_format = message['format']
        del message['syskey']
        del message['format']

        print "Incoming message from: %s" % syskey

        db.create(syskey)

        for k, v in response.iteritems():
            print "Got response for: %s" % k
            try:
                db.update(syskey, k, v, message_format)
            except:
                raise VogelerServerException("Error in repsonse handling")
    except TypeError:
        print "Invalid message: %s. Discarding" % message
    except:
        raise

def startup(pargs):
    global s, db

    if pargs.config:
        config = pargs.config

    if pargs.setup:
        setup(pargs)

    if pargs.load:
        explicit_load = True
        loadpath = pargs.load
    else:
        explicit_load = False
        loadpath = 'etc/vogeler/_design'

    db = engine.create_engine(pargs.dbhost)
    db.create_db()

    if explicit_load == True:
        print "Loading design docs from: %s" % loadpath
        rc = db.load_views(loadpath)
        sys.exit(rc)
    else:
        print "Skipping design document load"

    s = VogelerServer(callback_function=process_message,
                    host=pargs.qhost,
                    username=pargs.quser,
                    password=pargs.qpass)
    s.monitor()

def shutdown():
    print "Shutting down"
    s.close()
    sys.exit(0)

if __name__ == "__main__":
    appdesc = 'Vogeler server daemon'
    parser = argparse.ArgumentParser(description=appdesc)
    parser.add_argument('--config', help='Configuration file', default='/etc/vogeler', required=False)

    runtime = parser.add_argument_group('startup options')
    runtime.add_argument('--dbhost',
            help='Persistence uri (i.e. couch://localhost:5984/system_records or couch://user:pass@localhost:5984/system_records)',
            default='couch://127.0.0.1:5984/system_records',
            required=False)
    runtime.add_argument('--qhost',
            help='RabbitMQ server address',
            default='localhost',
            required=False)
    runtime.add_argument('--quser',
            help='RabbitMQ user',
            default='guest',
            required=False)
    runtime.add_argument('--qpass',
            help='RabbitMQ password',
            default='guest',
            required=False)

    configuration = parser.add_argument_group('setup options')
    configuration.add_argument('--setup', '-s', action='store_true', default=False, help='Setup exchanges and create db/load design docs in CouchDB', required=False)
    configuration.add_argument('--load', '-l', help='Load design docs in CouchDB. Provide full path to desgin docs')

    args = parser.parse_args()

    try:
        startup(args)
    except KeyboardInterrupt:
        shutdown()
# vim: set ts=4 et sw=4 sts=4 sta filetype=python :
