#!/usr/bin/python
import ConfigParser
import logging
from logging.handlers import SysLogHandler
import os
import signal

import argparse
import fedmsg

import fedwatch

log = logging.getLogger()

def configure_logger():
    formatter = logging.Formatter('%(asctime)s - %(module)s - %(levelname)s - %(message)s')
    cl = logging.StreamHandler()
    cl.setFormatter(formatter)
    formatter = logging.Formatter('%(module)s - %(levelname)s - %(message)s')
    sl = SysLogHandler('/dev/log', facility=SysLogHandler.LOG_USER)
    sl.setFormatter(formatter)

    log.addHandler(cl)
    log.addHandler(sl)
    return log

def getinfo(name):
    def g(msg, **config):
        return msg['msg']['commit'][name]
    return g

def termhandler(signum, frame):
    log.info("received SIGTERM. Closing shop.")
    raise SystemExit("received SIGTERM. Closing shop")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Run tasks on fedmsg changes',
				     formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('--config-file', default='/etc/fedwatch.conf',
                        help='Configuration file for topic selection and data mapping')
    parser.add_argument('--script-dir', default='/etc/fedwatch.d',
                        help='Directory with scripts to run for fedmsg messages')
    parser.add_argument('--debug', action='store_true',
                        help='Run with debug output')

    args = parser.parse_args()
    scp = ConfigParser.SafeConfigParser()
    if scp.read(args.config_file) != [args.config_file]:
        parser.error("Unable to load configuration file {conf}".format(
            conf=args.config_file))
    configure_logger()
    if args.debug:
        log.setLevel(logging.DEBUG)
    if not os.path.isdir(args.script_dir):
        parser.error("Script directory {d} is missing".format(d=args.script_dir))
    log.info("started")
    signal.signal(signal.SIGTERM, termhandler)
    try:
        confdict = {}
        for section in scp.sections():
            alist = []
            for key, arg in scp.items(section):
                alist.append(arg)
            confdict[section] = alist
        log.debug("Configuration dict: {conf}".format(conf=confdict))
        fw = fedwatch.FedWatch(confdict, args.script_dir)
        fw.watch()
    except KeyboardInterrupt:
        log.info("finishing up")
    except Exception, e:
        log.error("runtime exception: {e}".format(e=e))
