import sys
import os.path
import glob
import numpy as np

def compute_ongoing_vm_parameters(baseName, summaryName):
    suffix = 'all_traces.csv'
    fnames = []
    scan_directory(baseName, fnames, suffix)
    
    summaryData = {}
    for fname in fnames:
        data = np.loadtxt(fname, skiprows=2, unpack=True)
        t = data[0]
        downUpBorder = len(data)//2 + 1
        
        rIndex = fname.find('realization') + 11
        rStr = fname[rIndex:rIndex+2]
        if not summaryData.has_key(rStr):
            summaryData[rStr] = {}
        
        tOffset = 100.0
        dt = 0.025
        tStim = 200.0
        tBegin = -50.0
        windows = [50.0]
        for window in windows:
            beginBin = int((tStim+tBegin-tOffset)/dt+0.5)
            endBin = int((tStim+tBegin+window-tOffset)/dt+0.5)
            vmUp = []
            stdUp = []
            vmDown = []
            stdDown = []
            for i in range(1, downUpBorder):
                avgVm = np.mean(data[i][beginBin:endBin])
                stdVm = np.std(data[i][beginBin:endBin])
                vmDown.append(avgVm)
                stdDown.append(stdVm)
            for i in range(downUpBorder, len(data)):
                avgVm = np.mean(data[i][beginBin:endBin])
                stdVm = np.std(data[i][beginBin:endBin])
                vmUp.append(avgVm)
                stdUp.append(stdVm)
            avgVmUp = np.mean(vmUp)
            avgVmDown = np.mean(vmDown)
            avgStdUp = np.mean(stdUp)
            avgStdDown = np.mean(stdDown)
            
            if not summaryData[rStr].has_key(window):
                summaryData[rStr][window] = {}
                summaryData[rStr][window]['up'] = {}
                summaryData[rStr][window]['down'] = {}
            summaryData[rStr][window]['up']['avg'] = avgVmUp
            summaryData[rStr][window]['up']['std'] = avgStdUp
            summaryData[rStr][window]['down']['avg'] = avgVmDown
            summaryData[rStr][window]['down']['std'] = avgStdDown
    
    with open(summaryName, 'w') as summaryFile:
        header = 'realization\twindow\tstate\tVm avg\tVm STD\n'
        summaryFile.write(header)
        rStrings = summaryData.keys()
        rStrings.sort()
        for rStr in rStrings:
            windows = summaryData[rStr].keys()
            windows.sort()
            for window in windows:
                states = summaryData[rStr][window].keys()
                states.sort()
                for state in states:
                    line = rStr
                    line += '\t'
                    line += str(window)
                    line += '\t'
                    line += state
                    line += '\t'
                    line += str(summaryData[rStr][window][state]['avg'])
                    line += '\t'
                    line += str(summaryData[rStr][window][state]['std'])
                    line += '\n'
                    summaryFile.write(line)

def scan_directory(path, fnames, suffix):
    for fname in glob.glob(os.path.join(path, '*')):
        if os.path.isdir(fname):
            scan_directory(fname, fnames, suffix)
        elif fname.endswith(suffix):
            fnames.append(fname)
        else:
            continue

if __name__=='__main__':
    if len(sys.argv) == 3:
        pathName = sys.argv[1]
        summaryName = sys.argv[2]
        compute_ongoing_vm_parameters(pathName, summaryName)