(ns challenge-0154.core
  (:require [clojure.string :refer [trim join]]))

(def bracket-pairs {"(" ")", "{" "}", "[" "]"})

(def obrackets (apply hash-set (map first (keys bracket-pairs))))

(def cbrackets (apply hash-set (map first (vals bracket-pairs))))

(defn debracket [string]
  (if-let [[_ before obracket in cbracket after] (re-find #"(.*?)([\[({])(.+)([\])}])(.*)" string)]
    (if (= (bracket-pairs obracket) cbracket)
      (join " " (map trim (remove (partial = "")[(debracket in) before after])))
      (throw (RuntimeException. (format "Bracket mismatch: got '%s' but expected '%s'" cbracket (bracket-pairs obracket)))))
    (if (some obrackets string)
      (throw (RuntimeException. "Missing closing bracket"))
      (if (some cbrackets string)
        (throw (RuntimeException. "Missing opening bracket"))
        string))))

(println (debracket (read-line)))