(ns dda.build.devops
  (:require [clojure.spec.alpha :as s]
            [orchestra.core :refer [defn-spec]]
            [dda.build.devops.domain :as domain]
            [dda.build.infrastructure :as i]))

(s/def ::devops
  (s/keys :req-un [::domain/name]
          :opt-un [::domain/module ::domain/stage ::domain/project-root-path ::domain/build-dir-name ::domain/debug ::domain/dry-run]))

(def default {:name "dda-backup"
              :project-root-path "."
              :build-dir-name "target"
              :stage "dev"
              :debug false
              :dry-run false})

(defn-spec env-or-file string?
  [name string?]
  (let [from-env (System/getenv name)
        name-from-file (System/getenv (str name "_FILE"))]
    (cond
      (some? from-env) from-env
      (some? name-from-file) (slurp name-from-file)
      :else (throw (RuntimeException.
                    (str "Environment: [" name "," name-from-file "] was missing."))))))

(defn-spec clean-build-dir! nil?
  [devops ::devops]
  (let [final (merge default devops)]
    (i/execute! (domain/clean-build-dir-command final) final)))

(defn-spec create-build-dir! nil?
  [devops ::devops]
  (let [final (merge default devops)]
    (i/execute! (domain/create-build-dir-command final) final)))