# -*- coding: utf-8 -*-
# pylint: disable=resource-leakage

# Import Python libs
from __future__ import absolute_import, print_function
import subprocess
import hashlib
import pprint
import optparse

# Import Salt libs
import salt.utils.color
import salt.utils.files
import salt.utils.yaml

# Import 3rd-party libs
from salt.ext import six

colors = salt.utils.color.get_colors()


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 run 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 = r'salt \* {0} --yaml-out -t 500 > high'.format(command)
    subprocess.call(cmd, shell=True)
    with salt.utils.files.fopen('high') as fp_:
        data = salt.utils.yaml.safe_load(fp_)
    hashes = set()
    for key, val in six.iteritems(data):
        has = hashlib.md5(str(val)).hexdigest()
        if has not 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(
            colors['LIGHT_RED'],
            command,
            colors['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)
