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

'''
CloudControl CLI
'''

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

settings = {
    "port": "1984",
    "timeout": "5"
    }

try:
    # parse rc file
    if "HOME" in os.environ:
        settings["alias"] = "%s/.cc-cli.conf"%os.environ["HOME"]
        if os.access("%s/.cc-cli.conf"%os.environ["HOME"], os.R_OK):
            fparser = ConfigParser.SafeConfigParser()
            fparser.read("%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")
    oparser.add_option("-t", "--timeout",
                       action="store",
                       dest="timeout",
                       default="10",
                       help="connection timeout")



    (options, args) = oparser.parse_args()

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

    # 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 server name
    if "server" not in settings:
        raise BadArgument("No server address")

    # check port value
    try:
        settings["port"] = int(settings["port"])
    except:
        raise BadArgument("Invalid port number")

    # check timeout value
    try:
        settings["timeout"] = int(settings["timeout"])
    except:
        raise BadArgument("Invalid timeout")

    # check login
    if "login" not in settings:
        settings["login"] = raw_input("Login: ")

    # check password
    if "pass" not in settings:
        settings["pass"] = getpass.getpass("Password: ")

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

