"""Main module containing all the setup necessary for running the remote bootstrapping process
"""


def main():
    """Main function for invoking the bootstrap process remotely
    """
    # Get the commandline arguments
    opts = get_opts()

    from bootstrapvz.common.tools import load_data
    # load the manifest data, we might want to modify it later on
    manifest_data = load_data(opts['MANIFEST'])

    # load the build servers file
    build_servers = load_data(opts['--servers'])
    # Pick a build server
    from .build_servers import pick_build_server
    preferences = {}
    if opts['--name'] is not None:
        preferences['name'] = opts['--name']
    if opts['--release'] is not None:
        preferences['release'] = opts['--release']
    build_server = pick_build_server(build_servers, manifest_data, preferences)

    # Apply the build server settings to the manifest (e.g. the virtualbox guest additions path)
    manifest_data = build_server.apply_build_settings(manifest_data)

    # Load the manifest
    from bootstrapvz.base.manifest import Manifest
    manifest = Manifest(path=opts['MANIFEST'], data=manifest_data)

    # Set up logging
    from bootstrapvz.base.main import setup_loggers
    setup_loggers(opts)

    # Register deserialization handlers for objects
    # that will pass between server and client
    from . import register_deserialization_handlers
    register_deserialization_handlers()

    # Everything has been set up, connect to the server and begin the bootstrapping process
    with build_server.connect() as connection:
        connection.run(manifest,
                       debug=opts['--debug'],
                       dry_run=opts['--dry-run'])


def get_opts():
    """Creates an argument parser and returns the arguments it has parsed
    """
    from docopt import docopt
    usage = """bootstrap-vz-remote

Usage: bootstrap-vz-remote [options] --servers=<path> MANIFEST

Options:
  --servers <path>    Path to list of build servers
  --name <name>       Selects specific server from the build servers list
  --release <release> Require the build server OS to be a specific release
  --log <path>        Log to given directory [default: /var/log/bootstrap-vz]
                      If <path> is `-' file logging will be disabled.
  --pause-on-error    Pause on error, before rollback
  --dry-run           Don't actually run the tasks
  --color=auto|always|never
                     Colorize the console output [default: auto]
  --debug             Print debugging information
  -h, --help          show this help
    """
    return docopt(usage)
