"""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)
