#@input File(label="Working Directory", style="directory") expdir
#@input String(label="Red Channel Prefix", value="RC_") rcpre
#@input String(label="Cell Mask Prefix", value="CM_") cmpre
#@input String(label="Image Extension", value=".tif") imext
#@input DefaultDatasetIOService ds

import os
import csv
from datetime import datetime
from net.imglib2.util import Intervals

expdir = str(expdir)

csvfile = open(os.path.join(expdir, os.path.basename(expdir) + ".csv"), "w")

output = csv.writer(csvfile)

output.writerow(["Experiment", "Plate", "Timepoint", "Well", "Field", "Value"])

for root, dirs, files in os.walk(expdir):
    if not dirs:
        rcs = []
        cms = []
        for f in files:
            if f.endswith(imext):
                if f.startswith(rcpre):
                    rcs.append(f[len(rcpre):-len(imext)])
                if f.startswith(cmpre):
                    cms.append(f[len(cmpre):-len(imext)])

        if sorted(set(rcs)) != sorted(set(cms)):
            raise Exception("No all necessary images found in %s" % root)

        bns = sorted(set(rcs))

        if len(bns) < 1:
            raise Exception("No images found in %s" % root)

        for bn in bns:
            info = bn.split("_")
            experiment = os.path.basename(expdir)
            plate = os.path.basename(root)
            timepoint = datetime.strptime(info[2]+info[3], "%Yy%mm%dd%Hh%Mm").isoformat()
            well = info[0]
            field = info[1]

            print("Processing Experiment %s, Plate %s, Well %s, Field %s, Timepoint %s" % (experiment, plate, well, field, timepoint))

            data = ds.open(os.path.join(expdir, root, rcpre + bn + imext))
            mask = ds.open(os.path.join(expdir, root, cmpre + bn + imext))

            if not Intervals.equalDimensions(data, mask):
                raise Exception("Dimensions of images do not match.")

            dataCursor = data.localizingCursor()
            dataRA = data.randomAccess()
            maskRA = mask.randomAccess()

            pixels = []

            while dataCursor.hasNext():
                dataCursor.fwd()
                dataRA.setPosition(dataCursor)
                maskRA.setPosition(dataCursor)

                if maskRA.get().get() != 0:
                    pixels.append(dataRA.get().get())

            value = sum(pixels)/float(len(pixels))

            output.writerow([experiment, plate, well, field, timepoint, value])


csvfile.close()