(ns bigml-nodered-core.wz.stack
  (:require clojure.string
            [bigml-nodered-core.wz.units :as units]
            [bigml-nodered-core.wz.whizzml :as whizzml]))

(defn- make-step [name inputs in-pars fn out-pars]
  (let [r #(conj %1 [%2 (units/wz-get-keypath "r" %2 inputs)])
        lets (reduce r [] in-pars)]
    {:name name
     :in-pars in-pars
     :fun fn
     :out-pars out-pars
     :lets lets}))

(defn- wz-stack [msg]
  (or (.-wzStack msg) '()))

(defn- wz-stack-push [msg stack op]
  (do
    (set! ( .-wzStack msg) (conj stack op))
    msg))

(defn wz-stack-reset [msg]
  (js-delete msg "wzStack"))

(defn add-step [msg name f & [inputs in-pars out-pars]]
  (let [name (str (gensym (str (or name "node") "-")))]
    (do
      (wz-stack-push
       msg
       (wz-stack msg)
       (make-step name inputs in-pars f out-pars))
      (set! (.-whizzml msg)
            (clj->js (whizzml/whizzml (wz-stack msg) msg)))
      msg)))

;; (defn override-last-step [msg key value]
;;   (let [[step & stack] (wz-stack msg)]
;;     (wz-stack-push msg stack (assoc step key value))))
