#!/usr/bin/env python
""" This is a CLI to nago """

import nago
import sys
import getopt
import optparse
import nago.extensions
import pprint
import json
pp = pprint.PrettyPrinter(indent=4)


def parse_arguments(args=sys.argv[1:]):
    extension_names = nago.extensions.get_extension_names()

    parser = optparse.OptionParser()
    parser.usage = "%prog [options] <subcommand> <action>"
    parser.usage += "\n\nAvailable subcommands:\n"
    for i in extension_names:
        parser.usage += "* %s\n" % i
    parser.usage += '\nExamples:\n'
    parser.usage += "# Configure default server to use:\n"
    parser.usage += '%prog settings set server=<my_nago_server>\n\n'
    parser.usage += "# List all configured nodes:\n"
    parser.usage += '%prog nodes list all\n\n'
    parser.add_option('-c', '--config', help='path to nago.ini config file', default="/etc/nago/nago.ini")
    parser.add_option('-H', '--server', help='server to connect to (default localhost)', default=None)
    opts, args = parser.parse_args(args)
    if not args:
        parser.error("No sub-command given. See %prog --help for more info")
    arg1 = args[0]
    if arg1 in nago.extensions.get_extension_names():
        call_extension(arg1, *args[1:])
    else:
        raise Exception("invalid usage")


def call_extension(extension_name, *args):
    """ Call an extensions that has been loaded into nago.extentions

    First argument should a command inside that extension that will be run.

    If it is not provided, a list of all commands is printed instead.
    """
    extension = nago.extensions.get_extension(extension_name)
    available_commands = nago.extensions.get_method_names(extension_name)

    options = optparse.OptionParser()
    options.usage = "Usage: nago %s <action> [OPTIONS]" % extension_name
    options.usage += '\n\nDESCRIPTION\n===========\n\n'
    options.usage += extension.__doc__.strip()
    options.usage += "\n\nACTIONS\n=======\n"
    for action in available_commands:
        method = nago.extensions.get_method(extension_name, action)
        help_text = method.__doc__
        options.usage += "\n* %s():" % action
        options.usage += help_text + "\n"

    if not args or args[0] == 'help':
        options.error("No subcommand provided.")

    command = args[0]
    method = nago.extensions.get_method(extension_name, command)
    if not command in available_commands:
        options.error("Extension %s does not have an action called %s" % (extension_name, command))

    # Parse any command line arguments sent
    kwargs = {}
    arguments = []
    for i in args[1:]:
        if i.find('=') > 0:
            key, value = i.split('=', 1)
            if key == "json_data":
                data = json.loads(value)
                kwargs.update(data)
            else:
                kwargs[key] = value
        else:
            arguments.append(i)

    result = method(*arguments, **kwargs)
    pp.pprint(result)

if __name__ == '__main__':
    parse_arguments()