#!/usr/bin/env python3
# PYTHON_ARGCOMPLETE_OK

import os
import sys
import tooncher
import tooncher.controls
import yaml


def run(username, config_path, engine_path=None, validate_ssl_certs=True,
        cpu_limit_percent=None, enable_extended_keyboard_controls=False,
        extended_keyboard_control_toggle_keysym_name=None):

    if os.path.exists(config_path):
        with open(config_path) as f:
            config = yaml.load(f.read())
    else:
        config = {}

    if engine_path is None:
        if 'engine_path' in config:
            engine_path = config['engine_path']
        else:
            raise Exception('missing path to toontown engine')

    accounts = config['accounts'] if 'accounts' in config else []

    for account in accounts:
        if account['username'] == username:
            tooncher.launch(
                engine_path=engine_path,
                username=account['username'],
                password=account['password'],
                validate_ssl_certs=validate_ssl_certs,
                cpu_limit_percent=cpu_limit_percent,
                enable_extended_keyboard_controls=enable_extended_keyboard_controls,
                extended_keyboard_control_toggle_keysym_name=extended_keyboard_control_toggle_keysym_name,
            )


def _init_argparser():

    import argparse
    argparser = argparse.ArgumentParser(description=None)
    argparser.add_argument('username')
    argparser.add_argument(
        '--config',
        '-c',
        metavar='path',
        dest='config_path',
        help='path to config file (default: %(default)s)',
        default=os.path.join(os.path.expanduser('~'), '.tooncher'),
    )
    argparser.add_argument(
        '--engine-path',
        '-e',
        metavar='path',
        dest='engine_path',
        default=tooncher.TOONTOWN_ENGINE_DEFAULT_PATH,
        help='\n'.join([
            'path to toontown engine.',
            'this overrides the one specified in config file',
            '(default: %(default)s)',
        ]),
    )
    argparser.add_argument(
        '--no-ssl-cert-validation',
        '-k',
        dest='validate_ssl_certs',
        help='do not validate ssl certificates',
        action='store_false',
    )
    argparser.add_argument(
        '--cpu-limit',
        dest='cpu_limit_percent',
        type=int,
        default=None,
        help='maximally allowed cpu usage in percent'
            + ' (requires cpulimit command, default: %(default)s)',
    )
    argparser.add_argument(
        '--extended-controls',
        dest='enable_extended_keyboard_controls',
        action='store_true',
        help='enable extended keyboard controls'
            + ', e.g. walk with WASD'
            + ' (requires xlib for python, default: %(default)s)',
    )
    argparser.add_argument(
        '--extended-controls-toggle',
        metavar='KEYSYM_NAME',
        dest='extended_keyboard_control_toggle_keysym_name',
        default=tooncher.controls.EXTENDED_CONTROLS_DEFAULT_TOGGLE_KEYSYM_NAME,
        help='key to turn extended keyboard controls on / off.'
            + ' any keysym name may be used'
            + ' (see XStringToKeysym & X11/keysymdef.h, '
            + ' default: %(default)s)',
    )
    return argparser


def main(argv):

    argparser = _init_argparser()
    try:
        import argcomplete
        argcomplete.autocomplete(argparser)
    except ImportError:
        pass
    args = argparser.parse_args(argv)

    run(**vars(args))

    return 0

if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))