from ij import IJ, WindowManager
from ij.gui import GenericDialog, ShapeRoi, Plot
from ij.plugin.frame import RoiManager
from ij.measure import ResultsTable
from ij.plugin.filter import Analyzer
import IJ_utils as IJU

# reload(IJU)

titles = IJU.get_stack_window_titles()

if len(titles) == 0:
    print 'Open some images, dum-dum!'

else:
    titles += ['None']
    roiM = RoiManager.getInstance()
    rois = list(roiM.getRoisAsArray())
    bg_roi = ShapeRoi(rois[0])
    for roi in rois[1:]:
        bg_roi = bg_roi.or(ShapeRoi(roi))
    # roiM.addRoi(bg_roi)
    measurements = Analyzer.getMeasurements()
    # IJ.run("Set Measurements...", "mean redirect=None decimal=0")
    Analyzer.setMeasurements(2)

    g = GenericDialog('Select images to subtract background')
    for j in xrange(min(len(titles) - 1, 4)):
        g.addChoice('Image #' + str(j + 1), titles, titles[j])
    g.addCheckbox('Rename Images', False)
    g.centerDialog(True)
    g.showDialog()

    if g.wasOKed():
        imageTitles = []
        for i in xrange(len(g.getChoices())):
            imageTitles += [g.getNextChoice()]
        # print imageTitles
        rename = g.getCheckboxes()[0].getState()
        count = 0
        for title in imageTitles:
            count += 1
            if title != 'None':
                image = WindowManager.getImage(title)
                bgs = IJU.get_trace_mean_vals(image, bg_roi, True)
                bgs = map(lambda x: int(x), bgs)
                plot = Plot(title + '_BG', '', '', range(1, len(bgs) + 1), bgs)
                plot.show()
                WindowManager.setTempCurrentImage(image)
                image.deleteRoi()
                for i in xrange(len(bgs)):
                    # bg = int(results.getValue('Mean', i))
                    # print bg
                    image.setSlice(i + 1)
                    IJ.run("Subtract...", "value=" + str(bgs[i]) + " slice")

                if rename:
                    image.setTitle('W' + str(count))

    else:
        print 'Canceled'

    Analyzer.setMeasurements(measurements)
