#!/usr/bin/env python

from dm.common.utility.osUtility import OsUtility

from watchdog.observers.polling import PollingObserver
from fileSystemObserverAgent import FileSystemObserverAgent
from dmFileSystemEventHandler import DmFileSystemEventHandler

class WatchdogFileSystemObserverAgent(FileSystemObserverAgent):

    DAQ_PERMISSIONS_MODE = 0777

    def __init__(self):
        FileSystemObserverAgent.__init__(self)
        self.observer = PollingObserver()
        self.observedWatchDict = {}

    def createDirectory(self, dataDirectory):
        try:
            OsUtility.createDir(dataDirectory, mode=self.DAQ_PERMISSIONS_MODE)
        except Exception, ex:
            self.logger.warn('Unable to create directory %s: %s' % (dataDirectory, ex))

    def getFiles(self, dataDirectory):
        return OsUtility.findFilesAsDict(dataDirectory)

    def startObservingPath(self, dataDirectory, experiment):
        self.logger.debug('Starting observer for %s' % dataDirectory)
        eventHandler = DmFileSystemEventHandler(self.fileSystemObserver, dataDirectory, experiment)
        observedWatch = self.observer.schedule(eventHandler, dataDirectory, recursive=True)
        self.observedWatchDict[dataDirectory] = observedWatch

    def stopObservingPath(self, dataDirectory, experiment):
        observedWatch = self.observedWatchDict.get(dataDirectory)
        if observedWatch:
            self.logger.debug('Stopping observer for %s' % dataDirectory)
            self.observer.unschedule(observedWatch)
            del self.observedWatchDict[dataDirectory]
        else:
            self.logger.debug('Observer for %s is not active' % dataDirectory)

    def start(self):
        self.logger.debug('Starting watchdog observer agent')
        self.observer.start()

    def stop(self):
        self.logger.debug('Stopping watchdog observer agent')
        self.observer.stop()
        self.observer.join()