#!/usr/bin/python

'''Usage: %s <input inFolder> <output folder>
process "sentXXXXXXX" files in the indicated folder
'''

import glob
import os
import re
import struct
import sys
import time

def main():
    '''The main program'''
    inFolder, outFolder = parseCommandline()
    unserializePgm = sys.argv[0].replace('processSent.py','../bin/unserialize ' )
    processInputFiles( inFolder, outFolder, unserializePgm )

def parseCommandline():
    '''Analyze command line arguments'''
    if( len( sys.argv ) > 1 ):
        inFolder = sys.argv[1]
    else:
        inFolder = "."
    if( len( sys.argv ) > 2 ):
        outFolder = sys.argv[2]
    else:
        outFolder = inFolder
    return inFolder, outFolder
    
def expandWildcards( pattern ):
    '''Expand wildcards (glob)'''
    filenames = []
    return glob.glob( pattern )

def fixBackslashes( filename ):
    '''Convert backslashes to slashes in file name'''
    return re.sub( r'\\', '/', filename, 0 )

def runUnserialize( unserializePgm, outFolder, timeString ):
    
    unserializeCmdD = unserializePgm + ' -d ' + outFolder + timeString + "/shore"
    print "processInputFile(): Running: " + unserializeCmdD
    print "-" * 80
    os.system(unserializeCmdD)
    print "-" * 80

    unserializeCmdAL = unserializePgm + ' -a -l -y '  + outFolder + timeString + "/shore"
    print "processInputFile(): Running: " + unserializeCmdAL
    print "-" * 80
    os.system(unserializeCmdAL)
    print "-" * 80

    outvars = ""
    dirFile = open(outFolder + timeString + "/shore.dir", 'r')
    for dirLine in dirFile:
        if dirLine.find('*e code=') == 0:
            outvars += " " + dirLine.split('"')[1]

    unserializeCmdCNK = unserializePgm + ' -c -n -k -i -y ' + outFolder + timeString + "/shore" + outvars
    print "processInputFile(): Running: " + unserializeCmdCNK
    print "-" * 80
    os.system(unserializeCmdCNK)
    print "-" * 80

def processInputFiles( inFolder, outFolder, unserializePgm ):    
    '''Iterate through the input files'''
    filenames = expandWildcards( inFolder + "/*.sbd" )
    if( len(filenames) == 0 ):
        filenames = expandWildcards( inFolder + "sent*" )
    filenames.sort()
    index = -1
    packetsLeft = -1
    timeString = ""
    for filename in filenames:
        timeString, index, packetsLeft = processInputFile( outFolder, filename, timeString, index, packetsLeft, unserializePgm )
    runUnserialize( unserializePgm, outFolder, timeString )

def processInputFile( outFolder, filename, lastTimeString, lastIndex, lastPacketsLeft, unserializePgm ):    
    '''Merge files into new outputs'''
    print "processInputFile(): Processing: " + filename
    fileSize = os.path.getsize( filename )
    inFile = open(filename,"rb")
    headDat = inFile.read(8)
    bytesLeft = fileSize - len(headDat); 
    head = struct.unpack('IHH', headDat)
    timestamp = time.gmtime( head[0] )
    index = head[1]
    packetsLeft = head[2]
    timeString = time.strftime("/%Y%m%dT%H%M%S/", timestamp )
    timeFolder = outFolder + timeString
    print "processInputFile(): timeString:", timeString, " index:", index, " packetsLeft:", packetsLeft

    #Avoid duplicate packets
    if( timeString == lastTimeString and index == lastIndex and packetsLeft == lastPacketsLeft ):
        print "processInputFile(): Skipping duplicate file " + filename
        return timeString, index, packetsLeft;

    #Run unserialize if it's time to do so.
    if( not lastTimeString == "" and not lastTimeString == timeString ):
        runUnserialize( unserializePgm, outFolder, lastTimeString )

    #Create the outFolder
    if not os.path.isdir(outFolder):
        os.mkdir(outFolder)
        
    # Make the folder
    if timeString != lastTimeString:
        if not os.path.isdir(timeFolder):
            print "making folder " + timeFolder
            os.mkdir(timeFolder)
            # Make symlink to "latest"
            latestSymlink = outFolder + "latest"
            if os.path.exists(latestSymlink):
                os.remove( latestSymlink )
            print "processInputFile(): linking " + timeFolder + " to " + latestSymlink
            try:
                os.symlink( timeFolder, latestSymlink)
            except OSError:
                print "processInputFile(): can not link"

    
    partFilename = timeFolder + "shore%04d.lzma.part" % index
    if( index != lastIndex ):
        if os.path.exists(partFilename):
            os.remove( partFilename )
        outFile = open(partFilename,"wb")
    else:
        outFile = open(partFilename,"ab")
    
    data = inFile.read(bytesLeft);
    outFile.write( data );
    
    outFile.close()
    inFile.close()
    
    if( packetsLeft == 0 ):
        lzmaFilename = timeFolder + "shore%04d.lzma" % index
        if os.path.exists(lzmaFilename):
            os.remove( lzmaFilename )
        os.rename(partFilename, lzmaFilename)
        os.system("lzma -d -k " + lzmaFilename)
    return timeString, index, packetsLeft;
    

if __name__ == '__main__':

    main()

