#!/usr/bin/env python2

import json
import optparse
import subprocess
import sys

reload(sys)
sys.setdefaultencoding('utf8')

COLORS = { 'CRIT': '\033[31m',
           'WARN': '\033[34m',
           'OK': '\033[32m',
           'DEFAULT': '\033[0m'
         }


def filterJugglerData(jdata, status):
    checks_list = [ (i['service'], i['status'], i['description'], i['created']) for i in jdata if i['status'].count(status) ]
    checks_list = sorted(checks_list, key=lambda x: x[0])
    return checks_list

def printJugglerData(checks_list, status):
    default = COLORS.get('DEFAULT')
    for row in checks_list:
        print '   {4}{1:<50} {0}{2:^10} ({5}) {3:<40}{4}'.format(COLORS.get(status, default), row[0][:50], row[1], row[2], default, row[3])
def main():

    USAGE = "usage: %prog [--crit(-c)/--warn(-w)/--all(-a)]"

    VERSION = "1.0"

    parser = optparse.OptionParser(usage=USAGE, version=VERSION)

    parser.add_option( "-c", "--crit", dest="crit",
                        action="store_true", help="show CRIT and UNKNOWN checks"
                     )
    parser.add_option( "-w", "--warn", dest="warn",
                        action="store_true", help="show WARN and UNKNOWN checks"
                     )
    parser.add_option( "-a", "--all", dest="multi",
                        action="store_true", help="show ALL checks"
                     )
    parser.add_option( "-r", "--run", dest="run_force",
                        action="store", help="run force service check"
                     )

    (opts, args) = parser.parse_args()

    STATUS = [ 'OTHER', 'CRIT', 'WARN', 'OK' ]
    mask = 0b1000

    availableChecks = list()
    if opts.warn: mask = mask | 0b0010
    if opts.crit: mask = mask | 0b0100
    if opts.multi or opts.run_force: mask = mask | 0b1111
    if not (opts.multi and opts.crit and opts.warn): mask = mask | 0b1110

    if opts.run_force:
         result = subprocess.check_output(['jclient-api', 'run-check', '--service', opts.run_force])
    else:
         result = subprocess.check_output(['jclient-api', 'print-events'])
    jdata = json.loads(result)

    availableChecks = [ STATUS[idx] for idx, value in enumerate(format(mask, 'b')) if int(value) ]
    for status in availableChecks:
        checks_list = filterJugglerData(jdata, status)
        printJugglerData(checks_list, status)
        
if __name__ == '__main__':
    main()
