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

'''
CloudControl CLI Binary
'''

import os, os.path
import sys
import optparse
import ConfigParser
import pprint
import re
import warnings
from xdg import BaseDirectory

import cccli
from cccli.cli import Cli
from cccli.printer import Printer
from cccli.exception import *

canonical_name="cc-cli"
settings = {
    "port": "1984",
    "timeout": "5",
    "hsize": "100",
    "config": "%s/cli"%BaseDirectory.save_config_path(canonical_name),
    "alias": "%s/alias"%BaseDirectory.save_config_path(canonical_name),
    "history": "%s/history"%BaseDirectory.save_data_path(canonical_name),
    }

printer = Printer(False)

try:
    # parse config file
    if os.access(settings["config"], os.R_OK):
        fparser = ConfigParser.SafeConfigParser()
        fparser.read(settings["config"])
        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")
    oparser.add_option("--history-file",
                       action="store",
                       dest="history",
                       default="",
                       help="History file")
    oparser.add_option("--history-size",
                       action="store",
                       dest="hsize",
                       default="",
                       help="History max entry count")
    oparser.add_option("--force-yes",
                       action="store_true",
                       dest="forceyes",
                       default="",
                       help="Answer yes to yes/no question")
    (options, args) = oparser.parse_args()

    # options handling
    for i in ("debug", "login", "server", "port", "timeout", "history", "hsize", "forceyes"):
        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 int values
    for i in "port", "timeout", "hsize":
        try:
            settings[i] = int(settings[i])
        except:
            raise BadArgument("Invalid %s number"%i)
    # check login
    if "login" not in settings:
        printer.setinteractive()
        settings["login"] = printer.ask("Login: ")

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

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