#!/usr/bin/env python

import os
import json
import urllib

from dm.common.constants import dmProcessingStatus
from dm.common.utility.encoder import Encoder
from dm.common.exceptions.dmException import DmException
from dm.common.objects.experiment import Experiment
from dm.common.objects.uploadInfo import UploadInfo
from dm.common.objects.pluginInfo import PluginInfo
from dm.common.objects.daqInfo import DaqInfo
from daqRestApi import DaqRestApi

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

    @DaqRestApi.execute
    def startDaq(self, experimentName, dataDirectory, daqInfo={}):
        if not experimentName:
            raise InvalidRequest('Experiment name must be provided.')
        if not dataDirectory:
            raise InvalidRequest('Experiment data directory must be provided.')
        url = '%s/experimentsByName/%s/startDaq/%s' % (self.getContextRoot(), Encoder.encode(experimentName), Encoder.encode(dataDirectory))
        url += '?daqInfo=%s' % (Encoder.encode(json.dumps(daqInfo)))
        responseDict = self.sendSessionRequest(url=url, method='POST')
        return DaqInfo(responseDict)

    @DaqRestApi.execute
    def stopDaq(self, experimentName, dataDirectory):
        if not experimentName:
            raise InvalidRequest('Experiment name must be provided.')
        if not dataDirectory:
            raise InvalidRequest('Experiment data directory must be provided.')
        url = '%s/experimentsByName/%s/stopDaq/%s' % (self.getContextRoot(), Encoder.encode(experimentName), Encoder.encode(dataDirectory))
        responseDict = self.sendSessionRequest(url=url, method='POST')
        return DaqInfo(responseDict)

    @DaqRestApi.execute
    def getDaqInfo(self, id):
        if not id:
            raise InvalidRequest('Daq id must be provided.')
        url = '%s/experimentDaqs/%s' % (self.getContextRoot(),id)
        responseDict = self.sendSessionRequest(url=url, method='GET')
        return DaqInfo(responseDict)

    @DaqRestApi.execute
    def listDaqs(self, status=None):
        if not status:
            status = dmProcessingStatus.DM_PROCESSING_STATUS_ANY
        url = '%s/experimentDaqsByStatus/%s' % (self.getContextRoot(),status)
        responseData = self.sendSessionRequest(url=url, method='GET')
        return self.toDmObjectList(responseData, DaqInfo)

    @DaqRestApi.execute
    def upload(self, experimentName, dataDirectory, daqInfo={}):
        if not experimentName:
            raise InvalidRequest('Experiment name must be provided.')
        if not dataDirectory:
            raise InvalidRequest('Experiment data directory must be provided.')
        url = '%s/experimentsByName/%s/upload/%s' % (self.getContextRoot(), Encoder.encode(experimentName), Encoder.encode(dataDirectory))
        url += '?daqInfo=%s' % (Encoder.encode(json.dumps(daqInfo)))
        responseDict = self.sendSessionRequest(url=url, method='POST')
        return UploadInfo(responseDict)

    @DaqRestApi.execute
    def getUploadInfo(self, id):
        url = '%s/experimentUploads/%s' % (self.getContextRoot(),id)
        if not id:
            raise InvalidRequest('Upload id must be provided.')
        responseDict = self.sendSessionRequest(url=url, method='GET')
        return UploadInfo(responseDict)

    @DaqRestApi.execute
    def listUploads(self, status=None):
        if not status:
            status = dmProcessingStatus.DM_PROCESSING_STATUS_ANY
        url = '%s/experimentUploadsByStatus/%s' % (self.getContextRoot(),status)
        responseData = self.sendSessionRequest(url=url, method='GET')
        return self.toDmObjectList(responseData, UploadInfo)

    @DaqRestApi.execute
    def stopUpload(self, id):
        url = '%s/experimentUploads/stopUpload/%s' % (self.getContextRoot(),id)
        if not id:
            raise InvalidRequest('Upload id must be provided.')
        responseDict = self.sendSessionRequest(url=url, method='POST')
        return UploadInfo(responseDict)

    @DaqRestApi.execute
    def getProcessingPlugins(self):
        url = '%s/processingPlugins' % (self.getContextRoot())
        responseData = self.sendSessionRequest(url=url, method='GET')
        return self.toDmObjectList(responseData, PluginInfo)

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

if __name__ == '__main__':
    api = ExperimentRestApi('sveseli', 'sveseli', 'zagreb.svdev.net', 33336, 'http')
    print api.startDaq('experiment1', '/tmp/data/experiment1')