#!/usr/bin/env python3
import argparse
import logging
import importlib
import multiprocessing as mp
import sys

from logging.handlers import SysLogHandler

from ucloud.common.logging import NoTracebackStreamHandler
from ucloud.configure.main import configure_parser


def exception_hook(exc_type, exc_value, exc_traceback):
    logging.getLogger(__name__).error(
        'Uncaught exception',
        exc_info=(exc_type, exc_value, exc_traceback)
    )


sys.excepthook = exception_hook


if __name__ == '__main__':
    # Setting up root logger
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)

    syslog_handler = SysLogHandler(address='/dev/log')
    syslog_handler.setLevel(logging.DEBUG)
    syslog_formatter = logging.Formatter('%(pathname)s:%(lineno)d -- %(levelname)-8s %(message)s')
    syslog_handler.setFormatter(syslog_formatter)

    stream_handler = NoTracebackStreamHandler()
    stream_handler.setLevel(logging.INFO)
    stream_formatter = logging.Formatter('%(message)s')
    stream_handler.setFormatter(stream_formatter)

    logger.addHandler(syslog_handler)
    logger.addHandler(stream_handler)

    arg_parser = argparse.ArgumentParser()
    subparsers = arg_parser.add_subparsers(dest="command")
    
    api_parser = subparsers.add_parser("api")
    
    host_parser = subparsers.add_parser("host")
    host_parser.add_argument("--hostname", required=True)

    scheduler_parser = subparsers.add_parser("scheduler")

    filescanner_parser = subparsers.add_parser("filescanner")

    imagescanner_parser = subparsers.add_parser("imagescanner")

    metadata_parser = subparsers.add_parser("metadata")

    config_parser = subparsers.add_parser("configure")
    configure_parser(config_parser)
    args = arg_parser.parse_args()

    if not args.command:
        arg_parser.print_help()
    else:

        # if we start etcd in seperate process with default settings
        # i.e inheriting few things from parent process etcd3 module
        # errors out, so the following command configure multiprocessing
        # module to not inherit anything from parent.
        mp.set_start_method('spawn')

        arguments = vars(args)
        try:
            name = arguments.pop('command')
            mod = importlib.import_module("ucloud.{}.main".format(name))
            main = getattr(mod, "main")
            main(**arguments)
        except Exception as err:
            logger.exception(err)