#!/usr/bin/env python
from sys import exit
from sys import argv
from getopt import getopt, GetoptError

from opennode.cli.actions import templates, oms
from opennode.cli.config import get_config
from opennode.cli.log import get_logger

# default values
operation = 'cli'
log_level = None
template_type = 'openvz'
template_name = object()
storage_pool = get_config().getstring('general', 'default-storage-pool')
repo_name = object()

operations = {'list-templates': ('l', 'list-templates',
                    'List local and remote templates in all storage pools'),
              'import': ('i', 'import',
                    'Import template archive into a local storage pool.'),
              'sync': ('s', 'sync-template',
                    'Synchronize template with a remote repository.'),
              'help': ('h', 'help',
                    'Display help text.'),
              'register': ('r', 'register',
                    'Register with OpenNode Management Server (OMS)')}

parameters = {'template_type': ('t', 'template-type',
                    "Set template type. Supported values: 'openvz', 'kvm'"),
              'template_name': ('n', 'template-name',
                    'Set template name.'),
              'storage_pool': ('p', 'storage-pool',
                    'Set storage pool.'),
              'repo_name': ('r', 'repo-name',
                    'Set repository name (as defined in the opennode-tui configuration file)'),
              'log_verbosity': ('v', 'log-verbosity',
                    'Set log verbosity level. Default is INFO, supported are DEBUG, INFO, WARN'),
              'oms_hostname': ('o', 'oms-hostname',
                    'Set OMS hostname to use for sending registration request.'),
              'oms_port': ('p', 'oms-port',
                    'Set OMS port to use for sending registration request (default: 4506)'),
              }


def _help():
    print """
NAME
    opennode: OpenNode Terminal User Interface (TUI)

SYNOPSIS
    opennode [ACTION] [PARAMETERS]

    List of ACTIONS
%s

    List of PARAMETERS
%s

EXAMPLES:

    Import a new template:
        opennode --import --template-type openvz --storage-pool local --template-name filename.ova
        opennode -i -t openvz -p local -n filename.ova

    Synchronize a template named 'opennode-oms':
        opennode --sync --template-name opennode-oms --storage-pool local --repo-name default-openvz-repo
        opennode -s -n opennode-oms -p local -r default-openvz-repo

    List local and remote templates:
        opennode --list-templates
        opennode -l

    Register HN with OMS:
        opennode --register --oms-hostname oms.local
        opennode -r -o oms.local

SEE ALSO:
    OpenNode web page:
    http://opennodecloud.com
    """ % ("\n".join(["    -%s, --%s\n\t%s" % (s, l, d) for s, l, d in operations.values()]),
           "\n".join(["    -%s, --%s [%s]\n\t%s" % (s, l, l, d) for s, l, d in parameters.values()])
           )
    exit(2)

if __name__ == '__main__':
    #Run OpenNode utility
    try:
        short_opts = ''.join(zip(*operations.values())[0]) + \
                    ':'.join(zip(*parameters.values())[0]) + ':'
        long_options = list(zip(*operations.values())[1]) + \
                    ["%s=" % i for i in zip(*parameters.values())[1]]
        options, args = getopt(argv[1:], short_opts, long_options)
    except GetoptError, err:
        print str(err)
        _help()

    user_input = {'template_type': template_type,
                  'storage_pool': storage_pool}

    for o, a in options:
        if o.lstrip('-') == 'v':
            if a.upper() in ('INFO', 'DEBUG', 'WARN', 'WARNING'):
                log_level = a.upper()
            continue
        for op in operations.keys():
            if o.lstrip('-') in operations[op]:
                operation = op

        for par in parameters.keys():
            if o.lstrip('-') in parameters[par]:
                user_input[par] = a

    log = get_logger(log_level)
    log.info('Starting opennode-tui')

    if operation == 'cli':
        from opennode.cli.actions.vm import autodetected_backends
        autodetected_backends()
        from opennode.cli import screen
        tui = screen.OpenNodeTUI()
        tui.run()
    elif operation == 'list-templates':
        templates.list_templates()
    elif operation == 'import':
        assert('template_name' in user_input)
        templates.import_template(user_input['template_name'], user_input['template_type'], user_input['storage_pool'])
    elif operation == 'sync':
        assert('repo_name' in user_input)
        assert('template_name' in user_input)
        templates.sync_template(user_input['repo_name'], user_input['template_name'], user_input['storage_pool'])
    elif operation == 'register':
        assert('oms_hostname' in user_input)
        oms_port = int(user_input.get('oms_port', 4506))
        oms.register_oms_server(user_input['oms_hostname'], oms_port)
    elif operation == 'help':
        _help()
    log.info('opennode-tui exiting')
