//@ ImagePlus (label = "Labelmap") labelimp
//@ Boolean (label = "process all slices") process_all_slices

import ij.IJ
import ij.ImagePlus
import ij.ImageStack
import net.haesleinhuepf.clij2.CLIJ2
import net.haesleinhuepf.clij2.plugins.StatisticsOfLabelledPixels
import ij.plugin.frame.RoiManager


CLIJ2 clij2 = CLIJ2.getInstance()
clij2.clear()

def labelmap_cl

if (!labelimp.hasImageStack() || (labelimp.hasImageStack() && !process_all_slices)) {
	//print("process single image")
	labelmap_cl = clij2.push(labelimp.crop("whole-slice"))
	
	// Get largest bounding box for labels
	int maxW = 0
	int maxH = 0
	def stats = clij2.statisticsOfLabelledPixels(labelmap_cl, labelmap_cl)
	for (int j=0; j<stats.length ; j++){
	    if (stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.BOUNDING_BOX_WIDTH.value]>maxW){maxW=(int)stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.BOUNDING_BOX_WIDTH.value]}
	    if (stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.BOUNDING_BOX_HEIGHT.value]>maxH){maxH=(int)stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.BOUNDING_BOX_HEIGHT.value]}
	}
	def roi_label_cl = clij2.create([maxW, maxH])
	def roi_mask_cl = clij2.create([maxW, maxH])
	
	// reset RoiManager
	def rm = new RoiManager()
	rm = rm.getRoiManager()
	rm.reset()
	rm.setVisible(false)
	
	for (int j=0; j<stats.length ; j++){
	    if (stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.BOUNDING_BOX_X.value]==Double.MAX_VALUE){continue}
	    def i = (int) stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.MINIMUM_INTENSITY.value]
	    def x = stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.BOUNDING_BOX_X.value]
	    def y = stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.BOUNDING_BOX_Y.value]
	    clij2.crop2D(labelmap_cl, roi_label_cl, x.round(), y.round())
	    clij2.labelToMask(roi_label_cl, roi_mask_cl, i)
	    def myroi = clij2.pullAsROI(roi_mask_cl)
	    myroi.setLocation(x,y)
	    myroi.setName(i.toString())
	    rm.addRoi(myroi)
	}
	rm.setVisible(true)
	
} else {
	//print("process all images")
	int stackSize = labelimp.getStackSize()

	// reset RoiManager
	def rm = new RoiManager()
	rm = rm.getRoiManager()
	rm.reset()
	rm.setVisible(false)

	for (int s=1; s <= stackSize ; s++) {
		labelimp.setSliceWithoutUpdate(s)
		labelmap_cl = clij2.push(labelimp.crop("whole-slice"))	//select only active slice
		
		// Get largest bounding box for labels
		int maxW = 0
		int maxH = 0
		def stats = clij2.statisticsOfLabelledPixels(labelmap_cl, labelmap_cl)
		for (int j=0; j<stats.length ; j++){
		    if (stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.BOUNDING_BOX_WIDTH.value]>maxW){maxW=(int)stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.BOUNDING_BOX_WIDTH.value]}
		    if (stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.BOUNDING_BOX_HEIGHT.value]>maxH){maxH=(int)stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.BOUNDING_BOX_HEIGHT.value]}
		}
		def roi_label_cl = clij2.create([maxW, maxH])
		def roi_mask_cl = clij2.create([maxW, maxH])

		
		for (int j=0; j<stats.length ; j++){
		    if (stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.BOUNDING_BOX_X.value]==Double.MAX_VALUE){continue}
		    def i = (int) stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.MINIMUM_INTENSITY.value]
		    def x = stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.BOUNDING_BOX_X.value]
		    def y = stats[j][StatisticsOfLabelledPixels.STATISTICS_ENTRY.BOUNDING_BOX_Y.value]
		    clij2.crop2D(labelmap_cl, roi_label_cl, x.round(), y.round())
		    clij2.labelToMask(roi_label_cl, roi_mask_cl, i)
		    def myroi = clij2.pullAsROI(roi_mask_cl)
		    myroi.setLocation(x,y)
		    myroi.setPosition(s)
		    myroi.setName(s + "-" + i.toString())
		    rm.addRoi(myroi)
		}
	}
	rm.setVisible(true)
}

clij2.clear()


