import requests


class Call:
    WBREF_RETURN = 0
    JSON_RETURN = 1
    FILE_RETURN = 2
    def __init__(self, link, command,returnType, parameters=None, wbid=None, content=None):
        self.link=link
        self.returnType= returnType
        if(wbid!=None):
            self.url= link.server + "wb/" + str(wbid) + command;
        else:
            self.url= link.server + "app"+ command;
        self.parameters=parameters
        self.content=content;

    def run(self):
        self.result = requests.post(url=self.url, params=self.parameters,data=self.content)
        return self
    def getResult(self):
        return self.result

    def read(self):
       # if "exception" in self.result.json():
        #    print(self.result.json())
         #   return
        if self.returnType==self.WBREF_RETURN:
            return self.link.createWBRef(self.result.json()['id'])
        if self.returnType==self.JSON_RETURN:
            return self.result.json()
        else:
            return self.result.content

class GroLink:
    def __init__(self, server, id=None):
        self.server = server
        self.wbid=id

    def createWBRef(self, id):
        return WBRef(self.server, id)


    def createCall(self, command, returnType, wbid, parameters=None, content=None):
        call = Call(self, command, returnType, wbid=wbid, parameters=parameters, content=content)
        return call

    def createAppCall(self, command, returnType=Call.JSON_RETURN, parameters=None, content=None):
        return self.createCall(command=command, returnType=returnType, wbid=None, parameters=parameters,
                               content=content)

    def createWB(self, template="newRGG", name=None):
        return self.createAppCall(command="/ui/commands/app/create", returnType=Call.WBREF_RETURN,
                                  parameters={"name": template, "newName": name})

    def openWB(self, path = None, content=None):
        return self.createAppCall(command="/ui/commands/app/open",returnType=Call.WBREF_RETURN,parameters={"path":path},content=content)

    def listWB(self):
        return self.createAppCall("/ui/commands/app/listWB")

    def listExamples(self,tag =None):
        if tag==None:
            return self.createAppCall("/ui/commands/app/listExamples")
        else:
            return self.createAppCall("/ui/commands/app/listExamples", parameters={"tags":tag})
    def loadExample(self,name):
        return self.createAppCall("/ui/commands/app/loadExample",returnType=Call.WBREF_RETURN, parameters={"name":name})
    def listTemplates(self):
        return self.createAppCall("/ui/commands/app/listTemplates")
    def close(self):
        return self.createAppCall("/ui/commands/app/close")

class WBRef(GroLink):
    def __int__(self, server, wbid):
        super.__init__(server)
        self.wbid = wbid

    def createWBCall(self, command, returnType=Call.JSON_RETURN, parameters=None, content=None):
        return self.createCall(command=command, returnType=returnType, wbid=self.wbid, parameters=parameters,
                               content=content)

    def listRGGFunctions(self):
        return self.createWBCall("/ui/commands/listFunctions", Call.JSON_RETURN)

    def runRGGFunction(self,name):
        return self.createWBCall("/ui/commands/runRGGFunction",parameters={"name":name})

    def runXLQuery(self,query):
        return self.createWBCall("/ui/commands/runXLQuery",content=query)
    def compile(self):
        return self.createWBCall("/ui/commands/compile")

    def listFiles(self):
        return self.createWBCall("/ui/commands/getSourceFiles")

    def renameFile(self,name,newName):
        return self.createWBCall("/ui/commands/renameFile",parameters={"name":name,"newName":newName})

    def addFile(self,path, content=None):
        if(content!=None):
            return self.createWBCall("/ui/commands/addFile",parameters={"name":path},content=content)
        return self.createWBCall("/ui/commands/addFile", parameters={"path": path})

    def updateFile(self,name,content):
        return self.createWBCall("/ui/commands/setSourceFileContent",parameters={"name":name},content=content)

    def getFile(self,name):
        return self.createWBCall("/ui/commands/getSourceFileContent",parameters={"name":name},returnType=Call.FILE_RETURN)

    def removeFile(self,name):
        return self.createWBCall("/ui/commands/removeFile",parameters={"name":name})
    def getProjectGraph(self):
        return self.createWBCall("/ui/commands/getProjectGraph")

    def addNodetoRGG(self, inp, content =None):
        return self.addNode(inp,content,"RGGRoot")
    def addNode(self, inp, content =None, nodeid=None):
        if(nodeid!=None):
            if(content!=None):
                return self.createWBCall("/ui/commands/addNode",parameters={"extension":inp,"nodeId":nodeid},content=content)
            return self.createWBCall("/ui/commands/addNode",parameters={"path":inp,"nodeId":nodeid})
        else:
            if(content!=None):
                return self.createWBCall("/ui/commands/addNode",parameters={"extension":inp},content=content)
            return self.createWBCall("/ui/commands/addNode",parameters={"path":inp})

    def export3d(self,extension):
        return self.createWBCall("/ui/commands/export3d",parameters={"extension":extension}, returnType=Call.FILE_RETURN)

    def export3d_toFile(self,path):
        return self.createWBCall("/ui/commands/export3d",parameters={"path":path})

    def exportRGGRoot(self,extension):
        return self.createWBCall("/ui/commands/exportRGGRoot",parameters={"extension":extension}, returnType=Call.FILE_RETURN)

    def exportRGGRoot_toFile(self,path):
        return self.createWBCall("/ui/commands/exportRGGRoot",parameters={"path":path})

    def exportSubScene(self,extension,nodeid):
        return self.createWBCall("/ui/commands/exportSubScene",parameters={"extension":extension,"nodeId":nodeid}, returnType=Call.FILE_RETURN)

    def exportSubScene_toFile(self,path,nodeid):
        return self.createWBCall("/ui/commands/exportSubScene",parameters={"path":path,"nodeId":nodeid})


    def save(self,path=None):
        if(path==None):
            return self.createWBCall("/ui/commands/saveas",returnType=Call.FILE_RETURN)
        return self.createWBCall("/ui/commands/saveas",parameters={"path":path})

    def close(self):
        return self.createWBCall("/ui/commands/close")

    def listDatasets(self):
        return self.createWBCall("/ui/commands/getDatasets")

    def getDataset(self,name):
        return self.createWBCall("/ui/commands/getDataset",parameters={"name":name},returnType=Call.FILE_RETURN)

