#!/usr/bin/env python3.4

import os
import sys

_APP_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
sys.path.insert(0, _APP_PATH)

_DESCRIPTION = "Check the output of the OMSA omreport tool and trigger a response for problems."

import argparse

import omsaalert.utility
import omsaalert.notify

def _get_args():
    parser = argparse.ArgumentParser(description=_DESCRIPTION)

    parser.add_argument(
        'data_type',
        help="The type of content to analyze (pdisk, vdisk)")

    parser.add_argument(
        '-e', '--email',
        action='append',
        default=[],
        help="An email to alert if there is a problem (may be provided more than once)")

    parser.add_argument(
        '-c', '--command',
        action='append',
        default=[],
        help="A command to run if there is a problem (may be provided more than once)")

    parser.add_argument(
        '-cws', '--command-with-stdin',
        action='append',
        default=[],
        help="A command to run if there is a problem (may be provided more than once; receives information on STDIN)")

    parser.add_argument(
        '-v', '--verbose',
        action='store_true',
        help="Print problems to STDOUT.")

    parser.add_argument(
        '-s', '--always-succeed',
        action='store_true',
        help="Do not fail if there are problems.")


    args = parser.parse_args()
    return args

def _get_pretty_json(data):
    return json.dumps(
        data,
        sort_keys=True,
        indent=4,
        separators=(',', ': '))

def _main():
    args = _get_args()

    if sys.stdin.isatty() is True:
        print("Please provide data on STDIN.")
        sys.exit(1)

    content = sys.stdin.read()

    if args.data_type == 'pdisk':
        import omsaalert.pdisk_parser
        p = omsaalert.pdisk_parser.PdiskParser()
    elif args.data_type == 'vdisk':
        import omsaalert.vdisk_parser
        p = omsaalert.vdisk_parser.VdiskParser()
    else:
        print("Data type not valid: [{}]".format(args.data_type))
        sys.exit(2)

    problems = p.check_for_problems(content)
    if not problems:
        return

    if args.verbose is True:
        print(omsaalert.utility.get_pretty_json(problems))

    n = omsaalert.notify.Notify()

    if args.email:
        n.send_emails(args.email, problems)

    if args.command:
        for command in args.command:
            n.invoke_command(command, problems, stdin=False)

    if args.command_with_stdin:
        for command in args.command_with_stdin:
            n.invoke_command(command, problems, stdin=True)

    if args.always_succeed is False:
        sys.exit(5)

if __name__ == '__main__':
    _main()
