#!/usr/bin/env python

from dmObject import DmObject
from dm.common.utility.dictUtility import DictUtility

class UploadInfo(DmObject):

    DEFAULT_KEY_LIST = [ 'id', 'experimentName', 'dataDirectory', 'status', 'nProcessedFiles', 'nFiles', 'percentageComplete', 'startTimestamp', 'endTimestamp' ]

    def __init__(self, dict={}):
        DmObject.__init__(self, dict)
        self['fileDict'] = self.get('fileDict', {})

    def updateStatus(self):
        uploadStatus = self.get('status', 'running')
        if uploadStatus == 'done':
            return 
        fileDict = self.get('fileDict')
        nFiles = len(fileDict)
        nProcessedFiles = 0
        nProcessingErrors = 0
        processingErrors = {}
        for (filePath,uploadFileInfo) in fileDict.items():
            if uploadFileInfo.get('processed'):
                nProcessedFiles += 1
            elif uploadFileInfo.get('processingError'):
                nProcessingErrors += 1
                processingErrors[filePath] = uploadFileInfo.get('processingError')
        if len(processingErrors):
            self['processingErrors'] = processingErrors

        # need to handle 'failed' uploads
        nCompletedFiles = nProcessedFiles+nProcessingErrors
        if nCompletedFiles == nFiles:
            uploadStatus = 'done'
        self['status'] = uploadStatus
        self['nProcessedFiles'] = '%s' % (nProcessedFiles)
        self['nProcessingErrors'] = '%s' % (nProcessingErrors)
        self['nFiles'] = '%s' % (nFiles)

        percentageComplete = 100.0
        percentageProcessed = 100.0
        percentageProcessingErrors = 0.0
        if nFiles > 0:
             percentageComplete = float(nCompletedFiles)/float(nFiles)*100.0
             percentageProcessed = float(nProcessedFiles)/float(nFiles)*100.0
             percentageProcessingErrors = float(nProcessingErrors)/float(nFiles)*100.0
        self['percentageComplete'] = '%.2f' % percentageComplete
        self['percentageProcessed'] = '%.2f' % percentageProcessed
        self['percentageProcessingErrors'] = '%.2f' % percentageProcessingErrors

    def scrub(self, includeFileDetails=False):
        # Remove redundant information
        uploadInfo2 = DictUtility.deepCopy(self.data, excludeKeys='fileDict')
        if not includeFileDetails:
            return UploadInfo(uploadInfo2)
        fileDict = self.get('fileDict', {})
        fileDict2 = {}
        for (filePath,fileInfo) in fileDict.items():
            fileInfo2 = {}
            for key in ['processed', 'lastUpdateTime', 'processingError']:
                if fileInfo.has_key(key):
                    fileInfo2[key] = fileInfo[key]
            fileDict2[filePath] = fileInfo2
        uploadInfo2['fileDict'] = fileDict2
        return UploadInfo(uploadInfo2)