#!/usr/bin/env python2
# -*- encoding: utf-8 -*-

import sys
import os
import argparse
import yaml

CONFIG_PATH = '/etc/check_mysql_tests/main.yml'
MODULES = '/usr/share/check_mysql_tests/modules'
USAGE = '''Программа последовательно запускает проверки из каталога {0} 
           и проверяет локальные инстансы, указанные в аргументах. 
           В результате выводит список выполнения каждой из проверок.
        '''.format(MODULES)

sys.path.append(MODULES)

modules = [ os.path.splitext(i)[0] for i in os.listdir(MODULES) ]
modules = set(modules)

colors = { 0: '\033[92m',#GREEN
           1: '\033[93m',#YELLOW
           2: '\033[91m',#RED
           3: '\033[39m',#DEFAULT
           4: '\033[34m' #BLUE
}

def read_config(path):
    config = {}
    if os.path.exists(path):
        with open(path, 'r') as f1le:
            config = yaml.load(f1le)
    config = {} if config is None else config
    return config

def generate_monrun_string(status):
    crit, warn = [], []
    for instance in status:
        for msg in status[instance]:
            if msg[0] == 1:
                warn.append('[{0}] [{1}] WARNING'.format(instance, msg[2]))
            elif msg[0] > 1:
                crit.append('[{0}] [{1}] FAILED'.format(instance, msg[2]))
    args = [i for i in os.sys.argv if not i.endswith('-m')]
    if crit:
        print "2; {0}. Command: '{1}'".format('; '.join(crit), ' '.join(args))
    elif warn:
        print "1; {0}. Command: '{1}'".format("; ".join(warn), ' '.join(args))
    else:
        print "0; OK"

def generate_output_string(status):
    for instance in status:
        print "{1}[{0}] Run check{2}".format(instance, colors[4], colors[3])
        for msg in status[instance]:
            print "{3}[{0}] [{2}] {1}{4}".format(instance, msg[1], msg[2], colors[msg[0]], colors[3])
            if opts.verbose:
                 print __import__(msg[2]).help()
        print "{0}{1}{2}".format(colors[4], "="*30, colors[3])

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description=USAGE,
                                     epilog='Пример использования: %(prog)s ppcdata1 ppcdata2 -v')
    parser.add_argument("-v", "--verbose", action='store_true',
                        dest="verbose", help="более подробный вывод проблем с рецептами починки")
    parser.add_argument("-d", "--debug", action="store_true",
                        dest="debug", help="включение debug режима")
    parser.add_argument("-m", "--monrun", action="store_true",
                        dest="monrun", help='вывод результата по всем проверкам в формате monrun')
    parser.add_argument("instances", nargs='*', type=str, action="store",
                        help="указывает, какой инстанс требуется проверить")
    opts = parser.parse_args()

    instances = opts.instances if opts.instances else ["my"]
    config = read_config(CONFIG_PATH)

    status = {}
    for instance in instances:
        status[instance] = []
        for i in modules:
            module = __import__(i)
            result = module.run('/etc/mysql/{0}.cnf'.format(instance), **config)
            status[instance].append(result)
    if opts.monrun:
        generate_monrun_string(status)
    else:
        generate_output_string(status)
