; Written by TEttinger (tommy dot ettinger at gmail)
; Licensed under the EPL
(ns lazybot.plugins.nest
  (:use [lazybot registry info]
        [clojure.string :only [join trim split]]
        [clojure.pprint :only [pprint]])
  (:import java.io.PrintWriter
        java.io.StringWriter))

(defplugin
  (:cmd
   "Calls two nested commands."
   #{"`" "!" "nest"} 
   (fn [{:keys [com bot nick args channel] :as com-m}]
   	   (let [  sw (StringWriter.) 
   	   	   com-2 (assoc com-m
                     :com (ref (assoc-in @(get com-m :com) [:connection :sockout] (PrintWriter. sw))))
                   get-inner #(re-find #"\[\s*(\S+)\s+([^\]]+)\]" (join " " (rest %)))]
                   
     (if (and (seq args) 
     	       (find-command (:modules @bot) (first args))
     	       (seq (get-inner args))
     	       (find-command (:modules @bot) (nth (get-inner args) 1)))
       (do
       	 (let [inside-args (nth (get-inner args) 2)
       	 	 com-2 (assoc com-2
                     :com (ref (assoc @(get com-2 :com) :args (split inside-args #"\s"))))]
       	 	  
         ((:fn (find-command (:modules @bot) (nth (get-inner args) 1))) com-2 )
         
         (.flush (get-in @(get com-2 :com) [:connection :sockout]))
         (.close (get-in @(get com-2 :com) [:connection :sockout]))
         
         (let [new-args (.toString sw ) ; (get-in @com-2 [:com :connection :sockout]))
         	com-a (assoc com-m
                     :com (ref (assoc @(get com-m :com) :args (split new-args #"\s"))))]
           ((:fn (find-command (:modules @bot) (first args))) com-a )

         ))))))))