(ns claire-agent.core
  (:require [cljs.nodejs :as nodejs]
            [claire-agent.api :as api]
            [claire-agent.client :as client]
            [claire-agent.agent :as agent]
            [claire-common.utils :as utils]
            [clojure.core.async
             :as async
             :refer [>! <! go chan buffer close! put! alts! timeout]])
  (:require-macros [claire-common.macros :as macros :refer [<? go-try]]))

(nodejs/enable-util-print!)

(defn -main []
  "This is not really used"
  (println "Claire-Agent package"))

;; this is required for this file to be run in node
;;(set! *main-cli-fn* -main)

;; this is required for this file to be used as a node module
(set! (.-exports js/module) #js {:entrypoint -main})

(defn- marshal [f]
  (fn [& args] (go-try 
                (let [r (<? (apply f args))]
                  (clj->js r)))))

(def ^:private ^:const exports
  {:makeIntents agent/make-intents
   :api api/exports
   :intents agent/intents
   :query (utils/make-promise client/query)})

(set! (.-exports js/module)
      (clj->js 
       (reduce-kv
        (fn [a k v] (assoc a (utils/camel-case k) v))
        exports
        agent/intents)))

(macros/reify-templates "claire-agent")
