#!/usr/bin/env python
import argparse
from os.path import join, dirname
import sys
import inspect
import convertible
import traceback
from insider.facade import get_insider
import logging
import httplib

sys.path.append(join(dirname(__file__), '..'))

from owncloud import facade


def create_args_parser():
    parser = argparse.ArgumentParser(description='ownCloud control tool')

    subparsers = parser.add_subparsers(help='available commands', dest='action')
    parser.add_argument('--host', default="localhost", dest='host')
    parser.add_argument('--debug', action='store_true')

    sub = subparsers.add_parser('finish', help="finish setup with https")
    sub.add_argument('login')
    sub.add_argument('password')

    subparsers.add_parser('https_on', help="enable https")
    subparsers.add_parser('https_off', help="disable https")
    subparsers.add_parser('url', help="prints external url by service name")

    return parser


def call(func, kwargs):
    argspec = inspect.getargspec(func)
    params = kwargs
    if not argspec.keywords:
        params = dict()
        for key in kwargs.keys():
            if key in argspec.args:
                params[key] = kwargs.get(key)
    return func(**params)


def respond(result, message=None, success=True):
    response = dict(success=success, message=message, data=result)
    response_json = convertible.to_json(response)
    print(response_json)


def run(runner, debug):
    if debug:
        logging.basicConfig(level=logging.DEBUG)
        httplib.HTTPConnection.debuglevel = 1

    try:
        data = runner()
        respond(data)
    except Exception, e:
        if debug:
            print '-'*60
            traceback.print_exc(file=sys.stdout)
            print '-'*60

        respond(e, e.message, success=False)
        exit(1)


if __name__ == '__main__':
    control = facade.get_control(get_insider())

    parser = create_args_parser()
    args = parser.parse_args()

    method = getattr(control, args.action)
    run(lambda: call(method, vars(args)), args.debug)