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

from vogeler.vogeler import VogelerServer, VogelerException
#from couchdbkit import *
import couchdbkit as couch
from couchdbkit.loaders import FileSystemDocsLoader

class SystemRecord(couch.Document):
    system_name = couch.StringProperty()
    updated_at = couch.DateTimeProperty()

def setup(pargs):
    pass

def load(lp):
    try:
        print "Loading design docs from %s" % lp
        loader = FileSystemDocsLoader(lp)
        loader.sync(db, verbose=True)
    except:
        raise VogelerException('Failed to load design docs')

def process_message(message):

    response = message
    syskey = message['syskey']
    format = message['format']
    del message['syskey']
    del message['format']

    print "Incoming message from: %s" % syskey

    # now we save the record
    # check if the systemrecord already exists
    # if not, create it. if so, update it
    doc = SystemRecord.get_or_create(syskey)

    for k, v in response.iteritems():
        print "Got response for: %s" % k
        try:
            if format == 'list':
                v_split = [s.strip() for s in v.split("\n")]
                doc[k] = v_split

            if format == 'yaml':
                v_dict = yaml.load(v)
                doc[k] = v_dict
        except:
            return 1
            exit

    try:
        doc.system_name=syskey
        doc.updated_at=datetime.datetime.utcnow()
        doc.save()
    except:
        raise

def startup(pargs):
    global s, dbname, db

    if pargs.dbhost:
        dbhost = pargs.dbhost

    if pargs.dbport:
        dbport = pargs.dbport

    if pargs.dbuser:
        dbuser = pargs.dbuser

    if pargs.dbpass:
        dbpass = pargs.dbpass

    if pargs.qhost:
        qhost = pargs.qhost

    if pargs.qport:
        qport = pargs.qport

    if pargs.quser:
        quser = pargs.quser

    if pargs.qpass:
        qpass = pargs.qpass

    if pargs.config:
        config = pargs.config

    if pargs.dbname:
        dbname = pargs.dbname
    else:
        dbname = 'system_records'

    if pargs.setup:
        setup(pargs)

    if pargs.loadpath:
        loadpath = pargs.loadpath
    else:
        loadpath = 'etc/vogeler/_design'

    server = couch.Server()
    db = server.get_or_create_db(dbname)
    SystemRecord.set_db(db)

    if pargs.load == True:
        load(loadpath)

    s = VogelerServer(callback_function=process_message)
    s.monitor()

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

if __name__ == "__main__":
    appdesc = 'Vogeler server'
    parser = argparse.ArgumentParser(description=appdesc)
    parser.add_argument('--dbhost', '-dh', help='CouchDB server address', required=False)
    parser.add_argument('--dbport', '-dp', help='CouchDB server port', required=False)
    parser.add_argument('--dbuser', help='CouchDB user', required=False)
    parser.add_argument('--dbpass', help='CouchDB password', required=False)
    parser.add_argument('--dbname', help='CouchDB name', required=False)
    parser.add_argument('--qhost', '-qh', help='RabbitMQ server address', required=False)
    parser.add_argument('--qport', '-qp', help='RabbitMQ server port', required=False)
    parser.add_argument('--quser', help='RabbitMQ user', required=False)
    parser.add_argument('--qpass', help='RabbitMQ password', required=False)
    parser.add_argument('--config', '-c', help='Path to configuration file', default='/etc/vogeler', required=False)
    parser.add_argument('--setup', '-s', help='Setup exchanges and create db/load design docs in CouchDB', required=False)
    parser.add_argument('--load', '-l', action='store_true', default=False, help='Load design docs in CouchDB')
    parser.add_argument('--loadpath', '-lp', help='Path to design docs', required=False)

    args = parser.parse_args()

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