#!/usr/bin/env python

import os
import uuid
import time

from dm.common.objects.daqInfo import DaqInfo
from dm.common.utility.objectTracker import ObjectTracker
from dm.common.utility.timeUtility import TimeUtility
from dm.common.exceptions.objectAlreadyExists import ObjectAlreadyExists
from dm.common.exceptions.objectNotFound import ObjectNotFound

class DaqTracker(ObjectTracker):

    # Cache configuration
    objectClass = DaqInfo
    cacheSize = 100

    def __init__(self, *args, **kwargs):
        ObjectTracker.__init__(self, args, kwargs)
        self.activeDaqDict = {}

    def startDaq(self, experiment, dataDirectory, daqInfo={}):
        # Prevent second daq to be started in the same directory
        experimentName = experiment.get('name') 
        dataDir = os.path.normpath(dataDirectory)
        activeDaqKey = experimentName + dataDir
        oldDaqInfo = self.activeDaqDict.get(activeDaqKey)
        if oldDaqInfo:
            raise ObjectAlreadyExists('DAQ is already active for experiment %s in data directory %s.' % (experimentName, dataDirectory))
        daqId = str(uuid.uuid4())
        daqInfo['id'] =  daqId 
        daqInfo['experimentName'] = experimentName
        daqInfo['storageDirectory'] = experiment.get('storageDirectory')
        daqInfo['storageHost'] = experiment.get('storageHost')
        daqInfo['storageUrl'] = experiment.get('storageUrl')
        daqInfo['dataDirectory'] = dataDirectory
        daqInfo2 = DaqInfo(daqInfo)

        startTime = time.time()
        daqInfo2['startTime'] = startTime
        daqInfo2['startTimestamp'] = TimeUtility.formatLocalTimeStamp(startTime)

        self.activeDaqDict[activeDaqKey] = daqInfo2
        self.put(daqId, daqInfo2)
        return daqInfo2

    def stopDaq(self, experiment, dataDirectory):
        experimentName = experiment.get('name') 
        dataDir = os.path.normpath(dataDirectory)
        activeDaqKey = experimentName + dataDir
        daqInfo = self.activeDaqDict.get(activeDaqKey)
        if not daqInfo:
            raise ObjectNotFound('DAQ is not active for experiment %s in data directory %s.' % (experimentName, dataDirectory))
        endTime = time.time()
        daqInfo['endTime'] = endTime
        daqInfo['endTimestamp'] = TimeUtility.formatLocalTimeStamp(endTime)
        daqInfo.updateStatus()
        del self.activeDaqDict[activeDaqKey]
        return daqInfo

    def getDaqInfo(self, id):
        return self.get(id)

    def getDaqInfoByExperimentAndDataDirectory(self, experiment, dataDirectory):
        experimentName = experiment.get('name') 
        dataDir = os.path.normpath(dataDirectory)
        activeDaqKey = experimentName + dataDir
        return self.activeDaqDict.get(activeDaqKey)

####################################################################
# Testing

if __name__ == '__main__':
    tracker = DaqTracker.getInstance()
    print tracker
    experiment = {'name' : 'e1', 'owner' : 'sv'}
    dataDirectory = 'ftp://wolf:2811/data/e1'
    daqInfo = tracker.startDaq(experiment, dataDirectory) 
    daqId = daqInfo['id']
    print 'DAQ ID: ', daqId
    print 'DAQ INFO: ', tracker.getDaqInfo(daqId)
    print 'REMOVED DAQ: ', tracker.stopDaq(experiment, dataDirectory) 
    dataDirectory = 'ftp:///wolf:2811///data/e1'
    daqId = tracker.startDaq(experiment, dataDirectory) 
    print 'DAQ ID: ', daqId