(ns frontend.idb
  "This system component provides indexedDB functionality"
  (:require ["/frontend/idbkv" :as idb-keyval]
            [clojure.string :as string]
            [frontend.config :as config]
            [promesa.core :as p]))


;; offline db

;; To maintain backward compatibility

(defonce store (atom nil))

(defn remove-item!
  [key]
  (when (and key @store)
    (idb-keyval/del key @store)))

(defn set-item!
  [key value]
  (when (and key @store)
    (idb-keyval/set key value @store)))

(defn rename-item!
  [old-key new-key]
  (when (and old-key new-key @store)
    (p/let [value (idb-keyval/get old-key @store)]
      (when value
        (idb-keyval/set new-key value @store)
        (idb-keyval/del old-key @store)))))

(comment
  (defn set-batch!
    [items]
    (when (and (seq items) @store)
      (idb-keyval/setBatch (clj->js items) @store))))

(defn get-item
  [key]
  (when (and key @store)
    (idb-keyval/get key @store)))

(defn get-keys
  []
  (when @store
    (idb-keyval/keys @store)))

(defn get-nfs-dbs
  []
  (p/let [ks (get-keys)]
    (->> (filter (fn [k] (string/starts-with? k (str config/idb-db-prefix config/local-db-prefix))) ks)
         (map #(string/replace-first % config/idb-db-prefix "")))))

(defn clear-local-db!
  [repo]
  (when repo
    (p/let [ks (get-keys)
            ks (filter (fn [k] (string/starts-with? k (str config/local-handle "/" repo))) ks)]
      (when (seq ks)
        (p/all (map (fn [key]
                      (remove-item! key)) ks))))))

(defn start
  "This component's only responsibility is to create a Store object"
  []
  (reset! store (idb-keyval/newStore "localforage" "keyvaluepairs" 2)))
