#!/usr/bin/env python

import os
import urllib
import json

from dm.common.utility.encoder import Encoder
from dm.common.exceptions.dmException import DmException
from dm.common.exceptions.invalidRequest import InvalidRequest
from dm.common.objects.workflow import Workflow
from procRestApi import ProcRestApi

class WorkflowRestApi(ProcRestApi):
    
    def __init__(self, username=None, password=None, host=None, port=None, protocol=None):
        ProcRestApi.__init__(self, username, password, host, port, protocol)

    @ProcRestApi.execute
    def addWorkflow(self, fileInfo):
        owner = fileInfo.get('owner')
        if not owner:
            raise InvalidRequest('Workflow metadata must contain owner key.')
        experimentWorkflowPath = fileInfo.get('experimentWorkflowPath')
        if not experimentWorkflowPath:
            raise InvalidRequest('Workflow metadata must contain experimentWorkflowPath key.')
        url = '%s/filesByExperimentAndPath/%s/%s' % (self.getContextRoot(), owner, Encoder.encode(experimentWorkflowPath))
        url += '?fileInfo=%s' % (Encoder.encode(json.dumps(fileInfo)))
        responseData = self.sendSessionRequest(url=url, method='POST')
        return Workflow(responseData)

    @ProcRestApi.execute
    def updateWorkflow(self, fileInfo):
        owner = fileInfo.get('owner')
        if not owner:
            raise InvalidRequest('Workflow metadata must contain owner key.')
        experimentWorkflowPath = fileInfo.get('experimentWorkflowPath')
        if not experimentWorkflowPath:
            raise InvalidRequest('Workflow metadata must contain experimentWorkflowPath key.')
        url = '%s/filesByExperimentAndPath/%s/%s' % (self.getContextRoot(), owner, Encoder.encode(experimentWorkflowPath))
        url += '?fileInfo=%s' % (Encoder.encode(json.dumps(fileInfo)))
        responseData = self.sendSessionRequest(url=url, method='PUT')
        return Workflow(responseData)

    @ProcRestApi.execute
    def updateWorkflowById(self, fileInfo):
        owner = fileInfo.get('owner')
        if not owner:
            raise InvalidRequest('Workflow metadata must contain owner key.')
        id = fileInfo.get('id')
        if not id:
            raise InvalidRequest('Workflow metadata must contain id key.')
        url = '%s/filesByExperimentAndId/%s/%s' % (self.getContextRoot(), owner, id)
        url += '?fileInfo=%s' % (Encoder.encode(json.dumps(fileInfo)))
        responseData = self.sendSessionRequest(url=url, method='PUT')
        return Workflow(responseData)

    @ProcRestApi.execute
    def getWorkflows(self, owner, queryDict={}):
        if not owner:
            raise InvalidRequest('Invalid experiment name provided.')
        url = '%s/filesByExperiment/%s' % (self.getContextRoot(), owner)
        url += '?queryDict=%s' % (Encoder.encode(json.dumps(queryDict)))
        responseData = self.sendSessionRequest(url=url, method='GET')
        return self.toDmObjectList(responseData, Workflow)

    @ProcRestApi.execute
    def getWorkflowById(self, owner, id):
        if not owner:
            raise InvalidRequest('Invalid experiment name provided.')
        if not id:
            raise InvalidRequest('Invalid file id provided.')
        url = '%s/filesByExperimentAndId/%s/%s' % (self.getContextRoot(), owner, id)
        responseData = self.sendSessionRequest(url=url, method='GET')
        return Workflow(responseData)

    @ProcRestApi.execute
    def getWorkflowByName(self, owner, name):
        if not owner:
            raise InvalidRequest('Invalid owner name provided.')
        if not name:
            raise InvalidRequest('Invalid workflow name provided.')
        url = '%s/workflowsByOwner/%s/%s' % (self.getContextRoot(), owner, Encoder.encode(name))
        responseData = self.sendSessionRequest(url=url, method='GET')
        return Workflow(responseData)

#######################################################################
# Testing.

if __name__ == '__main__':
    api = WorkflowRestApi()