#!/usr/bin/env python3

import argparse
import logging
import logging.handlers
import os
import sys
#import logging
from coshsh.util import setup_logging
from notificationforwarder import baseclass
import traceback



if __name__ == '__main__':

    if not os.environ.get("OMD_ROOT", "").startswith("/omd/sites/") and os.environ.get("OMD_SITE", "") != "my_devel_site":
        print("This script must be run in an OMD environment")
        sys.exit(1)

    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawTextHelpFormatter,
        description="send a notification to another api or spool it")
    parser.add_argument('--eventopt', action = type('', (argparse.Action, ),
        dict(__call__ = lambda a, p, n, v, o:
            getattr(n, a.dest).update(dict([v.split('=', 1)])))),
                      default = {},
                      help="Naemon runtime attributes")
    parser.add_argument('--forwarder', '--receiver', action='store',
                      dest="forwarder",
                      help='''The type of recipient or transport forwarder.
This can be any backend you want, provided
there is a Python module forwarder.py in the folder
notificationforwarder/<forwarder> somewhere in your PYTHONPATH.
Examples are victorops, syslog, servicenow, rabbitmq,...''',
                      default="syslog")
    parser.add_argument('--forwardertag', '--receivertag', action='store',
                      dest="forwardertag",
                      help='A distinctive string which is added to the logfile',
                      default=None)
    parser.add_argument('--forwarderopt', '--receiveropt', action = type('', (argparse.Action, ),
        dict(__call__ = lambda a, p, n, v, o:
            getattr(n, a.dest).update(dict([v.split('=', 1)])))),
                      default = {},
                      help="""Receiver attributes. These are specific for
the type of backend. Example for VictorOps:
--forwarderopt company_id=...
--forwarderopt routing_key=...""")
    parser.add_argument('--formatter', action='store', dest="formatter", nargs='?', const=None,
                      help='''The formatter to use for the event...
                      default is the value of --receiver if not provided''',
                      default=argparse.SUPPRESS)
    parser.add_argument('--livestatus', action='store',
                      dest="livestatus",
                      help='The livestatus port')
    parser.add_argument('--verbose', action='store_true',
                      dest="verbose",
                      help='Show logs at stdout',
                      default=False)
    parser.add_argument('--debug', action='store_true',
                      dest="debug",
                      help='Increase the log level to DEBUG',
                      default=False)
    parser.add_argument('--version', action='version',
                      version=f'%(prog)s ')

    args = parser.parse_args()
    if not hasattr(args, 'formatter'):
        args.formatter = args.forwarder

    try:
        forwarder = baseclass.new(args.forwarder, args.forwardertag, args.formatter, args.verbose, args.debug, args.forwarderopt)
    except Exception as a:
        logger_name = "notificationforwarder_"+args.forwarder+("_"+args.forwardertag if args.forwardertag else "")
        logger = logging.getLogger(logger_name)
        if args.debug:
            traceback.print_exc(file=sys.stdout)
        logger.critical("there is no class for forwarder {} and formatter {}".format(args.forwarder, args.formatter))
        sys.exit(1)
    
    forwarder.forward(args.eventopt)

