(ns cljcastr.js-utils
  (:require [clojure.string :as str]))

(def log-level (atom :info))

(def log-level->int {:error 0
                     :warn 1
                     :info 2
                     :debug 3})

(defn get-anchor-link []
  (->> js/window.location.href
       (re-seq #"#.+$")
       first))

(defn get-query-params []
  (->> (js/URLSearchParams. js/window.location.search)
       .entries
       (map (fn [[k v]]
              [(keyword k) v]))
       (into {})))

(defn set-log-level!
  ([]
   (set-log-level! (-> (or (:log-level (get-query-params))
                           (.-CLJCASTR_LOG_LEVEL js/window))
                       keyword
                       (or :info))))
  ([level]
   (js/console.log "Setting log level to:" (clj->js level))
   (reset! log-level level)))

(defn log [level & args]
  (when (<= (log-level->int level) (log-level->int @log-level))
    (apply js/console.log (map clj->js args)))
  (last args))

(defn ->boolean
  "Parses a boolean from a string"
  [s]
  (if (string? s)
    (= "true" s)
    (boolean s)))

(defn ->int [x]
  (if (number? x)
    x
    (js/parseInt x)))

(defn snake->kebab [s]
  (str/replace s "_" "-"))
