(ns funimage.stan-tortuosity
 (:require [clojure.string :as string])
 (:import [mpicbg.imglib.image Image]
          [mpicbg.imglib.cursor Cursor]
          [script.imglib ImgLib]
          [mpicbg.imglib.type.numeric NumericType]
          [ij IJ]
          [ij.measure ResultsTable]
          [ij.gui WaitForUserDialog]
          [ij.plugin ImageCalculator]
          [ij.process ImageConverter]))
 
;(set! *warn-on-reflection* true)

(def filesep "/")

;(IJ/run "8-bit")

(def imp (IJ/getImage))

;(.setAutoThreshold (.getProcessor imp) "Default dark");
;(.autoThreshold (.getProcessor imp))

;(IJ/run "Convert to Mask" "slice");

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

;(IJ/setTool "polygon");
;(IJ/waitForUser "Select a ROI") 
;(WaitForUserDialog. "Select a ROI") 

(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))

(def split-names 
	(for [cid (range 1 4)]
		(str "C" cid "-" orig-name)))

(def red-name (last 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 (first split-names))
(def blue (imp-from-title blue-name))
(def gray-name nil)
(def gray (when gray-name (imp-from-title gray-name)))

(defn select-dup [inname outname]
	(IJ/selectWindow inname)
	(IJ/run "Duplicate..." (str "title=" outname)))

; Handle masking

(IJ/selectWindow blue-name)
(IJ/run "8-bit")
(IJ/run "Fire"); Set color so it can be seen more easily
(IJ/setTool "polygon");
;(IJ/waitForUser "Select a ROI") 
(.show (WaitForUserDialog. "Select a ROI (polygon)"))
(.setAutoThreshold (.getProcessor blue) "Default dark");
(.autoThreshold (.getProcessor blue))
;(IJ/run "Convert to Mask" "slice");

(IJ/run "Clear Outside" "stack");
(IJ/run "Maximum..." "radius=25 slice");
(IJ/run "Fill Holes" "slice");

; Save mask and ROI

;; Start extracing PECAM stuff
(IJ/selectWindow green-name)

(.setAutoThreshold (.getProcessor green) "Default dark");
(.autoThreshold (.getProcessor green))

(def image-calc (ImageCalculator.))

(def masked-pecam (.run image-calc "AND create" blue green))
(.show masked-pecam)
(def masked-pecam-title (.getTitle masked-pecam))


(def mask-stats (.getStatistics blue))
(def masked-pecam-stats (.getStatistics masked-pecam))

(def skeleton-pecam (.duplicate masked-pecam))
(.show skeleton-pecam)
(IJ/selectWindow (.getTitle skeleton-pecam))
(IJ/run "Skeletonize (2D/3D)")
(def skeleton-stats (.getStatistics skeleton-pecam))

(def result-table (ResultsTable/getResultsTable)) 

;(def result-table (.getResultsTable text-panel))

;(def result-table (ResultsTable.))

(.showRowNumbers result-table true)

(def row-number (.getCounter result-table))

(println (re-seq #"WT" orig-name))

(def class-label (cond (> (count (string/split orig-name  #"WT")) 1) "WT"
					   (> (count (string/split orig-name #"KO")) 1) "KO"
					   :else "UNKNOWN"))

(.setValue result-table "Filename" row-number orig-name)
(.setValue result-table "Type" row-number class-label)
(.setValue result-table "Area-Ratio" row-number (/ (.mean masked-pecam-stats) (.mean mask-stats)))
(.setValue result-table "Skeleton area" row-number (/ (.mean skeleton-stats) (.mean mask-stats)))

(.show result-table "Results")

(.close red)
(.close green)
(set! (.changes blue) false); avoid save changes dialog
(.close blue)
(set! (.changes masked-pecam) false); avoid save changes dialog
(.close masked-pecam)
(set! (.changes skeleton-pecam) false); avoid save changes dialog
(.close skeleton-pecam)

;(IJ/run "Close All")
