import yaml
import subprocess
import hashlib
import pprint
import optparse

BLACK = '\033[0;30m'
DARK_GRAY = '\033[1;30m'
LIGHT_GRAY = '\033[0;37m'
BLUE = '\033[0;34m'
LIGHT_BLUE = '\033[1;34m'
GREEN = '\033[0;32m'
LIGHT_GREEN = '\033[1;32m'
CYAN = '\033[0;36m'
LIGHT_CYAN = '\033[1;36m'
RED = '\033[0;31m'
LIGHT_RED = '\033[1;31m'
PURPLE = '\033[0;35m'
LIGHT_PURPLE = '\033[1;35m'
BROWN = '\033[0;33m'
YELLOW = '\033[1;33m'
WHITE = '\033[1;37m'
DEFAULT_COLOR = '\033[00m'
RED_BOLD = '\033[01;31m'
ENDC = '\033[0m'


def parse():
    '''
    Parse command line options
    '''
    parser = optparse.OptionParser()
    parser.add_option('-r',
            '--runs',
            dest='runs',
            default=10,
            type=int,
            help='Specify the number of times to fun the consistency check')
    parser.add_option('-c',
            '--command',
            dest='command',
            default='state.show_highstate',
            help='The command to execute')

    options, args = parser.parse_args()
    return options.__dict__


def run(command):
    '''
    Execute a single command and check the returns
    '''
    cmd = 'salt \* {0} --yaml-out -t 500 > high'.format(command)
    subprocess.call(cmd, shell=True)
    data = yaml.load(open('high'))
    hashes = set()
    for key, val in data.items():
        has = hashlib.md5(str(val)).hexdigest()
        if not has in hashes:
            print('{0}:'.format(has))
            pprint.pprint(val)
        hashes.add(has)
    if len(hashes) > 1:
        print('{0}Command: {1} gave inconsistent returns{2}'.format(
            RED,
            command,
            ENDC,
            ))


if __name__ == '__main__':
    opts = parse()
    for _ in opts['runs']:
        for command in opts['command'].split(','):
            print('-' * 30)
            print('Running command {0}'.format(command))
            run(command)
