#!/usr/bin/env python

__requires__ = ['moncov > 0.1']

import moncov; moncov.ctl.disable()
import aaargh
import re
import argparse
import sys
import logging
import functools

logging.basicConfig()
log = logging.getLogger(__file__)


def catching(func):
    '''decorating in try/exept&log err'''
    @functools.wraps(func)
    def decorated(*args, **kvs):
        try:
            func(*args, **kvs)
        except Exception as e:
            log.error(func.func_name + ' failed: %r' % e.message)
            sys.exit(2)
    return decorated

class ReAction(argparse.Action):
    '''custom Re.compiling argparse action'''
    def __call__(self, parser, namespace, values, option_string=None):
        '''Re.compile action'''
        setattr(namespace, self.dest, [re.compile(value) for value in values])

app = aaargh.App(description='moncov collects coverage remotelly')
app.arg('-a', '--dbhost', help='Host name of the MongoDB to use', default=moncov.conf.DBHOST)
app.arg('-b', '--dbport', help='Port of the MongoDB service', type=int, default=moncov.conf.DBPORT)
app.arg('-c', '--dbname', help='Name of the db to collect stats in', default=moncov.conf.DBNAME)


@app.cmd(help='drop remote db')
@catching
def drop(dbhost, dbport, dbname):
    db = moncov.conf.get_db(host=dbhost, port=dbport, name=dbname)
    moncov.ctl.drop(db)

@app.cmd(help='enable collecting')
@app.cmd_arg('-e', '--system', help='apply sytem-wide', default=True, action='store_true')
@app.cmd_arg('-f', '--whitelist', help='filter regexps', default=moncov.conf.WHITELIST, action=ReAction, nargs='+')
@app.cmd_arg('-g', '--blacklist', help='filter regexps', default=moncov.conf.BLACKLIST, action=ReAction, nargs='+')
@catching
def enable(dbhost, dbport, dbname, system, whitelist, blacklist):
    moncov.ctl.sys_enable(host=dbhost, port=dbport, name=dbname, whitelist=whitelist, blacklist=blacklist)

@app.cmd(help='disable collecting')
@app.cmd_arg('-e', '--system', help='apply sytem-wide', default=True, action='store_true')
@catching
def disable(*args, **kvs):
    moncov.ctl.sys_disable()

@app.cmd(help='simple stats')
@app.cmd_arg('-f', '--whitelist', help='filter regexps', default=moncov.conf.WHITELIST, action=ReAction, nargs='+')
@app.cmd_arg('-g', '--blacklist', help='filter regexps', default=moncov.conf.BLACKLIST, action=ReAction, nargs='+')
@catching
def simple(dbhost, dbport, dbname, whitelist, blacklist):
    db = moncov.conf.get_db(host=dbhost, port=dbport, name=dbname)
    moncov.stats.simple.print_stats(db=db, whitelist=whitelist, blacklist=blacklist)


if __name__ == '__main__':
    app.run()
