(ns funimage.stan-stackplitmerge
 (:require [clojure.string :as string])
 (:import [mpicbg.imglib.image Image]
          [mpicbg.imglib.cursor Cursor]
          [script.imglib ImgLib]
          [mpicbg.imglib.type.numeric NumericType]
          [ij.plugin Duplicator]
          [ij IJ]
          [ij.process ImageConverter]))

;(set! *warn-on-reflection* true)

(def std-dev-k 1)
(def filesep "/")

(def imp (IJ/getImage))
(def orig-name (.getTitle imp))
(def basename (string/replace (string/replace orig-name ".czi" "") ".lsm" ""))
(println "Base filename:" basename)
(def orig-directory (IJ/getDirectory "image"));(.directory (.getFileInfo imp)))
(println "Directory:" orig-directory)

(IJ/run "Split Channels")

(defn imp-from-title [title]
	(IJ/selectWindow title)
    (let [imp (IJ/getImage)
    	  iconv (ImageConverter. imp)]
    	(.convertToRGB iconv)
    	imp))

(def num-channels (.getNChannels imp))

(if (= num-channels 3)
	(do
		(def split-names
			(for [cid (range 1 4)]
				(str "C" cid "-" orig-name)))

		(def red-name (first split-names))
		(def red (imp-from-title red-name))
		(def green-name (second split-names))
		(def green (imp-from-title green-name))
		(def blue-name (last split-names))
		(def blue (imp-from-title blue-name))
		(def gray-name nil)
		(def gray (when gray-name (imp-from-title gray-name))))
	(do
		(def split-names
			(for [cid (range 1 5)]
				(str "C" cid "-" orig-name)))

		(def red-name (first split-names))
		(def red (imp-from-title red-name))
		(def green-name (nth split-names 1))
		(def green (imp-from-title green-name))
		(def blue-name (nth split-names 2))
		(def blue (imp-from-title blue-name))
		(def gray-name (last split-names))
		(def gray (when gray-name (imp-from-title gray-name)))))

(defn select-dup [inname outname]
	(IJ/selectWindow inname)
	(let [new-imp (.run (Duplicator.) (IJ/getImage))]
		(.setTitle new-imp outname)
		(.show new-imp)
		(IJ/selectWindow outname)
		new-imp)
	#_(IJ/run "Duplicate..." (str "title=" outname " stack")))

; RG
;(select-dup red-name "redchan")
;(select-dup green-name "greenchan")
(IJ/run "Merge Channels...",
    (str "red=" red-name
    	" green=" green-name
    	" blue=*None*"
    	" gray=*None* keep"))
(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "RG_" basename ".tiff"))


; GB
;(select-dup green-name "greenchan")
;(select-dup blue-name "bluechan")
(IJ/run "Merge Channels...",
    (str "red=*None*"
    	" green=" green-name
    	" blue=" blue-name
    	" gray=*None* keep"))
(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "GB_" basename ".tiff"))

; RB
;(select-dup red-name "redchan")
;(select-dup blue-name "bluechan")
(IJ/run "Merge Channels...",
    (str "red=" red-name
    	" green=*None*"
    	" blue=" blue-name
    	" gray=*None* keep"))
(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "RB_" basename ".tiff"))

(when (= num-channels 4)
	; RGy
	;(select-dup red-name "redchan")
	;(select-dup gray-name "graychan")
	(IJ/run "Merge Channels...",
	    (str "red=" red-name
	    	" green=*None*" ;green-name
	    	" blue=*None*"
	    	" gray=" gray-name " keep"))
	(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "RGy_" basename ".tiff"))

	; GGy
	(select-dup green-name "greenchan")
	(select-dup gray-name "graychan")
	(IJ/run "Merge Channels...",
	    (str "red=*None*"
	    	" green=greenchan"; green-name
	    	" blue=*None*" ;blue-name
	    	" gray=graychan"))
	(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "GGy_" basename ".tiff"))

	; BGy
	(select-dup blue-name "bluechan")
	(select-dup gray-name "graychan")
	(IJ/run "Merge Channels...",
	    (str "red=*None*"; red-name
	    	" green=*None*"
	    	" blue=" blue-name
	    	" gray=" gray-name " keep"))
	(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "BGy_" basename ".tiff"))

	; RGBGy
	(select-dup red-name "redchan")
	(select-dup green-name "greenchan")
	(select-dup blue-name "bluechan")
	(select-dup gray-name "graychan")
	(IJ/run "Merge Channels...",
	    (str "red=" red-name
	    	" green=" green-name
	    	" blue=" blue-name
	    	" gray=" gray-name " keep"))
	(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "RGBGy_" basename ".tiff"))
	)

; RGB
(select-dup red-name "redchan")
(select-dup green-name "greenchan")
(select-dup blue-name "bluechan")
(IJ/run "Merge Channels...",
    (str "red=" red-name
    	" green=" green-name
    	" blue=" blue-name
    	" gray=*None* keep"))
(IJ/saveAsTiff (IJ/getImage) (str orig-directory filesep "RGB_" basename ".tiff"))

; Individual channels
(IJ/saveAsTiff red (str orig-directory filesep "R_" basename ".tiff"))
(IJ/saveAsTiff green (str orig-directory filesep "G_" basename ".tiff"))
(IJ/saveAsTiff blue (str orig-directory filesep "B_" basename ".tiff"))
(when gray (IJ/saveAsTiff gray (str orig-directory filesep "Gy_" basename ".tiff")))


(IJ/run "Close All")
