#!/usr/bin/env python
#coding=utf8

'''
CloudControl CLI
'''

import os, os.path
import sys
import cccli
from cccli import printer,cli
import optparse
import ConfigParser
import pprint
import re
import warnings
import getpass

settings = {}

try:
    # parse rc file
    if "HOME" in os.environ and  os.access("%s/.cc-cli.conf"%os.environ["HOME"], os.R_OK):
        fparser = ConfigParser.SafeConfigParser()
        fparser.read("%s/.cc-cli.conf"%os.environ["HOME"])
        settings["alias"] = "%s/.cc-cli.conf"%os.environ["HOME"]
        if fparser.has_section("cli"):
            settings.update(fparser.items("cli"))

    # parse env
    if "CC_SERVER" in os.environ:
        settings["server"] = os.environ["CC_SERVER"]
    if "CC_PORT" in os.environ:
        settings["port"] = os.environ["CC_PORT"]
    if "CC_LOGIN" in os.environ:
        settings["login"] = os.environ["CC_LOGIN"]
    if "CC_PASS" in os.environ:
        settings["pass"] = os.environ["CC_PASS"]
    if "CC_DEBUG" in os.environ:
        settings["debug"] = "True"

    # Parse line argument
    oparser = optparse.OptionParser(usage="usage: %prog [options] [commands]",
                                    version=cccli.version)
    oparser.add_option("-d", "--debug",
                       action="store_true",
                       dest="debug",
                       default="",
                       help="debug mode")
    oparser.add_option("-l", "--login",
                       action="store",
                       dest="login",
                       default="",
                       help="server login")
    oparser.add_option("-s", "--server",
                       action="store",
                       dest="server",
                       default="",
                       help="server address")
    oparser.add_option("-p", "--port",
                       action="store",
                       dest="port",
                       default="1984",
                       help="server port")

    (options, args) = oparser.parse_args()

    # options handling
    for i in ("debug", "login", "server", "port"):
        if hasattr(options, i):
            o = getattr(options, i)
            if o != "":
                settings[i] = o

    # show usage if no default conf and no server given
    if "login" not in settings or "server" not in settings:
        oparser.print_help()
        sys.exit(1)

    # remove pass to prevent stupid guy
    #if "pass" in settings:
    #    del settings["pass"]

    # debug stuff
    if "debug" in settings:
        cccli.debug = bool(settings["debug"])
    else:
        warnings.filterwarnings("ignore")
    printer.debug("Debugging on")
    printer.debug("Settings: %s"%settings)

    # checking needs
    if settings["server"] == "":
        raise Exception("Invalid server name/ip")
    try:
        settings["port"] = int(settings["port"])
    except:
        raise Exception("Invalid port number")

    # asking for login
    if settings["login"] == "":
        settings["login"] = raw_input("Login: ")

    # asking for password
    if settings["pass"] == "":
        settings["pass"] = getpass.getpass("Password: ")

    # start cli
    cli = cli.Cli(settings, args)
    cli.start()
except KeyboardInterrupt:
    exit(1)
except Exception, e:
    if cccli.debug:
        printer.fatal(str(e), exitcode=-1)
        printer.warn("This is a not expected error, please report it!")
        raise
    printer.fatal(str(e))
