import os
import sys

from mozlog.structured import structuredlog, commandline

from .. import wptcommandline

from update import WPTUpdate

def remove_logging_args(args):
    """Take logging args out of the dictionary of command line arguments so
    they are not passed in as kwargs to the update code. This is particularly
    necessary here because the arguments are often of type file, which cannot
    be serialized.

    :param args: Dictionary of command line arguments.
    """
    for name in args.keys():
        if name.startswith("log_"):
            args.pop(name)


def setup_logging(args, defaults):
    """Use the command line arguments to set up the logger.

    :param args: Dictionary of command line arguments.
    :param defaults: Dictionary of {formatter_name: stream} to use if
                     no command line logging is specified"""
    logger = commandline.setup_logging("web-platform-tests-update", args, defaults)

    remove_logging_args(args)

    return logger


def run_update(logger, **kwargs):
    updater = WPTUpdate(logger, **kwargs)
    return updater.run()


def main():
    args = wptcommandline.parse_args_update()
    logger = setup_logging(args, {"mach": sys.stdout})
    assert structuredlog.get_default_logger() is not None
    success = run_update(logger, **args)
    sys.exit(0 if success else 1)

