#!/usr/bin/env python
# -*- coding: utf-8 -*-
#///////////////////////////////////////////////////////////////////////////////
#// Copyright (c) 2000-2018 Ericsson Telecom AB                               //
#//                                                                           //
#// All rights reserved. This program and the accompanying materials          //
#// are made available under the terms of the Eclipse Public License v2.0     //
#// which accompanies this distribution, and is available at                  //
#// https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.html                                 //
#///////////////////////////////////////////////////////////////////////////////

import sys
import urllib2
import json

class DsRestAPI:
    __url = "http://localhost:4001/"

    def __init__(self, p_url="", p_useProxy=True):
        self.__useProxy = p_useProxy
        if p_url is not None and p_url is not "":
            if p_url[-1] != '/':
                p_url += '/'
            self.__url = p_url
        self.__url += "api.dsapi"
        self._urlOpener = urllib2.build_opener(urllib2.HTTPHandler(), urllib2.ProxyHandler({} if not p_useProxy else None))

    def __httpcall(self, postdata, method = 'POST'):
        '''
        Does a HTTP Request against the specified URL, with the optional POSTDATA piggyback, setting the method to the optional HTTP Verb.
        Returns the HTTP Response body.
        '''
        if not isinstance(postdata, basestring):
            postdata = json.dumps(postdata)
        req = urllib2.Request(self.__url, postdata, {'Content-Type': 'application/json'})
        req.add_header('Connection', 'close')
        req.get_method = lambda: method
        try:
            return self._urlOpener.open(req).read()
        except Exception as e:
            msg = 'Error connecting to server: ' + str(e)
            proxyList = [name[0:-5] for name in dir(urllib2.ProxyHandler()) if name.endswith('open')];
            if 'http' in proxyList and self.__useProxy:
                msg += '\\nThe error may be caused by wrong proxy settings. Current possible poxys are: \\n' + ' '.join(proxyList)
                msg += '\\nPlease try to use -noproxy option.'
            return '{"contentList":[{"node":{"val":"' + msg + '", "tp":4}}]}'

    def getList(self, request):
        '''Returns the response to the request as a json object'''
        response = json.loads(self.getContentList(request))
        if "contentList" in response:
            response = response["contentList"]
        return response

    def getContentList(self, request):
        '''Returns the response to the request as a string.'''
        dsCall = {"requests": request};
        return self.__httpcall(dsCall)

    def get(self, request):
        '''Returns the first element of the response to the request as a json object.'''
        return self.getList(request)[0]

    def getData(self, aSource, aElement, aParams = None, aPtcName = None):
        '''Creates a getData request from the parameters and returns its response object, i.e. either a {list: [...]} or a {node: {...}} as a json object.'''
        return self.get( [ {"getData": {"source": aSource, "element": aElement, "ptcname": aPtcName, "params": aParams}} ] )

    def setData(self, aSource, aElement, aContent, aType, aParams = None, aPtcName = None, aIndxs = None):
        '''Creates a setData request from the parameters and returns its response object, i.e. either a {list: [...]} or a {node: {...}} as a json object.'''
        return self.get( [ {"setData": {"source": aSource, "element": aElement, "ptcname": aPtcName, "params": aParams, "content": aContent, "indxsInList": ([int(aIndxs)] if aIndxs is not None else None), "tp": int(aType or 0)}} ] )

    def getHelp(self, aSource = None, aElement = None):
        '''Returns the help as a json object.'''
        if aSource is not None and aElement is not None:
            help = self.getData("DataSource", "help", [ {"paramName": "Format", "paramValue": "JSON"}, {"paramName": "Source", "paramValue": aSource }, {"paramName": "Element", "paramValue": aElement} ] )
        elif aSource is not None:
            help = self.getData("DataSource", "help", [ {"paramName": "Format", "paramValue": "JSON"}, {"paramName": "Source", "paramValue": aSource } ] )
        else:
            help = self.getData("DataSource", "help", [ {"paramName": "Format", "paramValue": "JSON"} ] )
        txt = help["node"]["val"]
        try:
            help["node"]["val"] = json.loads(''.join(chr(int(''.join(c), 16)) for c in zip(txt[0::2], txt[1::2]))) # http://stackoverflow.com/a/9641593/357403
            return json.dumps(help, indent = 2, check_circular = False)
        except Exception as e:
            return help

def usage():
    print "Usage:"
    print sys.argv[0], "-?"
    print sys.argv[0], "[-u <URL>] [-noproxy] -h [source [element]]"
    print sys.argv[0], "[-u <URL>] [-noproxy] -f file"
    print sys.argv[0], "[-u <URL>] [-noproxy] -j jsonString"
    print sys.argv[0], "[-u <URL>] [-noproxy] -source <Source> -element <Element> [-ptcname <PTCName>] [-params <ParamName1 ParamValue1 ParamName2 ParamValue2 ...>] [-content <Content> -tp <Tp> [-indxsInList index1 index2]]"
    print "All parameters that are sent to the server are case sensitive."
    print "Legend:"
    print "\t-?\t\tLocal usage"
    print "\t-u\t\tThe URL of the remote server, it is http://localhost:4001 by default."
    print "\t-noproxy\tSet this option to disable proxy usage."
    print "\t-h\t\tHelp from remote server. Accepts 2 optional arguments to filter on Source, or on Source-specific Element."
    print "\t-f\t\tLoad request from a file."
    print "\t-j\t\tThe json string as the request. WARNING: use single ' to enclose the string."
    print ""
    print "List of types for the -tp parameter and their meaning:"
    print "\t 1: intType"
    print "\t 2: floatType"
    print "\t 3: boolType"
    print "\t 4: charstringType"
    print "\t 5: octetstringType"
    print "\t 6: hexstringType"
    print "\t 7: bitstringType"
    print "\t 8: integerlistType"
    print "\t 9: floatlistType"
    print "\t10: charstringlistType"
    print "\t11: statusLEDType"
    print ""
    print "Examples:"
    print "DataSource help:\t", sys.argv[0], ' -h'
    print "Source filtered help:\t", sys.argv[0], ' -h ExecCtrl'
    print "Help for an element:\t", sys.argv[0], ' -h ExecCtrl ScGrpStart'
    print "Simple GetData request:\t", sys.argv[0], ' -source ExecCtrl -element Progressbar'
    print "Use different address:\t", sys.argv[0], ' -u http://127.0.0.1:9876 -source ExecCtrl -element Progressbar'
    print "Use without proxy:\t", sys.argv[0], ' -u http://127.0.0.1:4001 -noproxy -source ExecCtrl -element Progressbar'
    print "GetData with params:\t", sys.argv[0], ' -source ExecCtrl -element ScGrpStart -params ScenarioGroup ScGroup1'
    print "SetData example:\t", sys.argv[0], ' -source ExecCtrl -element ScGrpStart -content true -tp 3 -params ScenarioGroup ScGroup1'
    print "GetData from JSON:\t", sys.argv[0], ' -j \'[{"getData": {"source": "ExecCtrl", "element": "ScGrpStart", "params": [{"paramName": "ScenarioGroup", "paramValue": "ScGroup1"}]}}]\''
    print "SetData from JSON:\t", sys.argv[0], ' -j \'[{"setData": {"source": "ExecCtrl", "element": "ScGrpStart", "params": [{"paramName": "ScenarioGroup", "paramValue": "ScGroup1"}], "tp": 3, "content": "true"}}]\''
    print "Request from file:\t", sys.argv[0], ' -f path/to/request/request.json'

def printHumanReadableResponse(response):
    if "list" in response:
        print [str(listElement["node"]["val"]) for listElement in response["list"]]
    else:
        print response["node"]["val"]

def DsRestAPIPythonAPIMain(argv):
    argv = argv[1:]
    url = ''
    if '-u' in argv:
        i = argv.index('-u')
        url = argv[i + 1]
        argv.pop(i)
        argv.pop(i)

    proxies = True
    if '-noproxy' in argv:
        proxies = False
        i = argv.index('-noproxy')
        argv.pop(i)
        
    api = DsRestAPI(url, proxies)

    if '-?' in argv or len(argv) == 0:
        usage()
    elif '-g' in argv or '-s' in argv:
        print '-g and -s parameters are not supported anymore due to an interface rationalization. Please update your request according to the new behavior.'
    elif '-h' in argv:
        i = argv.index('-h')
        if i + 2 < len(argv):
            print api.getHelp(argv[i+1], argv[i+2])
        elif i + 1 < len(argv):
            print api.getHelp(argv[i+1])
        else:
            print api.getHelp()
    elif '-f' in argv:
        fileName = argv[argv.index('-f') + 1]
        f = open(fileName, 'r')
        request = json.load(f)
        f.close()
        print api.getContentList(request)
    elif '-j' in argv:
        jsonString = argv[argv.index('-j') + 1]
        request = json.loads(jsonString)
        print api.getContentList(request)
    else:
        requests = []
        request = {}
        if '-content' in argv and '-tp' in argv:
            requests.append({'setData': request})
        else:
            requests.append({'getData': request})
        i = 0
        while i < len(argv):
            if i + 1 >= len(argv):
                print 'Suspicious parameter detected:', argv[i]
                i += 1
            elif argv[i] == '-source' and not argv[i+1].startswith('-'):
                request['source'] = argv[i+1]
                i += 2
            elif argv[i] == '-element' and not argv[i+1].startswith('-'):
                request['element'] = argv[i+1]
                i += 2
            elif argv[i] == '-ptcname' and not argv[i+1].startswith('-'):
                request['ptcname'] = argv[i+1]
                i += 2
            elif argv[i] == '-content' and not argv[i+1].startswith('-'):
                request['content'] = argv[i+1]
                i += 2
            elif argv[i] == '-tp' and not argv[i+1].startswith('-'):
                request['tp'] = int(argv[i+1])
                i += 2
            elif argv[i] == '-params':
                request['params'] = []
                i += 1
                while i + 1 < len(argv) and not argv[i].startswith('-') and not argv[i+1].startswith('-'):
                    request['params'].append({'paramName': argv[i], 'paramValue': argv[i+1]})
                    i += 2
            elif argv[i] == 'indxsInList':
                request['indxsInList'] = []
                i += 1
                while i < len(argv) and not argv[i].startswith('-'):
                    request['indxsInList'].append(int(argv[i]))
                    i += 1
            else:
                print 'Suspicious parameter detected:', argv[i]
                i += 1
        printHumanReadableResponse(api.get(requests))
    return 0

if __name__ == "__main__":
    errCode = -1;
    try:
        errCode = DsRestAPIPythonAPIMain(sys.argv)
    except Exception as e:
        print 'Error while processing your request: ' + str(e)
    sys.exit(errCode)