#!/usr/bin/env python

import os
import time
from dm.common.utility.loggingManager import LoggingManager
from dm.common.utility.timeUtility import TimeUtility
from dm.common.processing.plugins.fileProcessor import FileProcessor
from dm.common.mongodb.api.fileMongoDbApi import FileMongoDbApi
from dm.common.utility.dmSubprocess import DmSubprocess

class ScriptProcessingPlugin(FileProcessor):

    PROCESSING_SCRIPT_KEY = 'processingScript'

    def __init__(self):
        FileProcessor.__init__(self)
        self.fileMongoDbApi = FileMongoDbApi()
        self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__)

    def processFile(self, fileInfo):
        experimentName = fileInfo.get('experimentName')
        experimentFilePath = fileInfo.get('experimentFilePath')
        daqInfo = fileInfo.get('daqInfo', {})
        processingScript = daqInfo.get(self.PROCESSING_SCRIPT_KEY)
        if not processingScript:
            self.logger.debug('Ignoring file %s for experiment %s' % (experimentFilePath, experimentName))
            return
  
        self.logger.debug('Processing file %s for experiment %s' % (experimentFilePath, experimentName))

        storageDirectory = fileInfo.get('storageDirectory')
        storageFilePath = os.path.join(storageDirectory, experimentFilePath)

        # Process file
        try:
            p = DmSubprocess('%s %s' % (processingScript, storageFilePath))
            p.run()
            stdOut = p.getStdOut()
        except Exception, ex:
            self.logger.error('Cannot process file %s for experiment %s: %s' % (experimentFilePath, experimentName, ex))
            return

        # Prepare catalogging entry
        fileInfo2 = {}
        fileInfo2['fileName'] = os.path.basename(experimentFilePath)
        fileInfo2['experimentName'] = experimentName
        fileInfo2['processingScriptOutput'] = '%s' % stdOut.strip()
        self.fileMongoDbApi.updateOrAddExperimentFile(fileInfo2)


#######################################################################
# Testing.
if __name__ == '__main__':
    pass