import os
import sys
from logging import DEBUG, INFO

from cfg_checker.cli.arguments import add_global_arguments
from cfg_checker.cli.command import execute_command, helps, parsers, \
    parsers_inits
from cfg_checker.common.settings import CheckerConfiguration
from cfg_checker.common import logger, logger_cli
from cfg_checker.helpers.args_utils import MyParser

pkg_dir = os.path.dirname(__file__)
pkg_dir = os.path.normpath(pkg_dir)


def config_check_entrypoint():
    """
    Main entry point. Uses nested parsers structure
    with a default function to execute the comand

    :return: - no return value
    """
    # Main entrypoint
    parser = MyParser(prog="# Mirantis Cloud configuration checker")
    add_global_arguments(parser)
    subparsers = parser.add_subparsers(dest='command')

    # create parsers
    for _command in helps.keys():
        _parser = subparsers.add_parser(
            _command,
            help=helps[_command]
        )
        parsers[_command] = parsers_inits[_command](_parser)

    # parse arguments
    try:
        args, unknown = parser.parse_known_args()
    except TypeError:
        logger_cli.info("\n# Please, check arguments")
        sys.exit(1)

    if unknown:
        logger_cli.error(
            "# Unexpected arguments: {}".format(
                ", ".join(["'{}'".format(a) for a in unknown])
            )
        )
        sys.exit(1)

    if not args.command:
        parser.print_help()
        logger_cli.info("\n# Please, type a command listed above")
        sys.exit(1)

    # Handle debug option before config init
    if args.debug:
        logger_cli.setLevel(DEBUG)
    else:
        logger_cli.setLevel(INFO)

    # Init the config and pass externally configured values
    config = CheckerConfiguration(args)

    # Execute the command
    result = execute_command(args, args.command, config)
    logger.debug(result)
    sys.exit(result)


if __name__ == '__main__':
    config_check_entrypoint()
