#!/usr/bin/env bb

(require '[babashka.curl :as curl]
         '[babashka.fs :as fs])

(defn download-if-needed!
  [dest data]
  (doseq [{:keys [id file-uri] :as item} data]
    (let [file (fs/file dest id)
          rsp  (curl/get file-uri {:as :stream})]

      (when (not= 200 (:status rsp))
        (println (format "unable to download %s (uri: %s)" id file-uri))
        (System/exit -1))

      (when-not (fs/exists? (str file))
        (println (format "=> downloading %s" id))
        (with-open [output (io/output-stream file)]
          (io/copy (:body rsp) output))))))

(defn read-defs-file
  [path]
  (with-open [content (io/reader path)]
    (edn/read-string (slurp content))))

(let [[path dest] *command-line-args*]
  (when (or (nil? path)
            (nil? dest))
    (println "invalid arguments")
    (System/exit -1))

  (when-not (fs/exists? path)
    (println (format "file %s does not exists" path))
    (System/exit -1))

  (when-not (fs/exists? dest)
    (fs/create-dirs dest))

  (let [data (read-defs-file path)]
    (download-if-needed! dest data)))