#!/usr/bin/env python

import os
import json
import urllib

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 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={}):
        url = '%s/experiments/startDaq' % (self.getContextRoot())
        if experimentName is None or not len(experimentName):
            raise InvalidRequest('Experiment name must be provided.')
        if dataDirectory is None or not len(dataDirectory):
            raise InvalidRequest('Experiment data directory must be provided.')
        daqInfo['experimentName'] = experimentName
        daqInfo['dataDirectory'] = dataDirectory
        url += '?experimentName=%s' % Encoder.encode(experimentName)
        url += '&dataDirectory=%s' % Encoder.encode(dataDirectory)
        url += '&daqInfo=%s' % (Encoder.encode(json.dumps(daqInfo)))
        responseDict = self.sendSessionRequest(url=url, method='POST')
        return Experiment(responseDict)

    @DaqRestApi.execute
    def stopDaq(self, experimentName):
        url = '%s/experiments/stopDaq' % (self.getContextRoot())
        if experimentName is None or not len(experimentName):
            raise InvalidRequest('Experiment name must be provided.')
        url += '?experimentName=%s' % Encoder.encode(experimentName)
        responseDict = self.sendSessionRequest(url=url, method='POST')
        return Experiment(responseDict)

    @DaqRestApi.execute
    def upload(self, experimentName, dataDirectory, daqInfo={}):
        url = '%s/experiments/upload' % (self.getContextRoot())
        if experimentName is None or not len(experimentName):
            raise InvalidRequest('Experiment name must be provided.')
        if dataDirectory is None or not len(dataDirectory):
            raise InvalidRequest('Experiment data directory must be provided.')
        daqInfo['experimentName'] = experimentName
        daqInfo['dataDirectory'] = dataDirectory
        url += '?experimentName=%s' % Encoder.encode(experimentName)
        url += '&dataDirectory=%s' % 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/experiments/upload/%s' % (self.getContextRoot(),id)
        if not id:
            raise InvalidRequest('Upload id must be provided.')
        responseDict = self.sendSessionRequest(url=url, method='GET')
        return UploadInfo(responseDict)

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

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