(ns auto-ap.views.components.modal
  (:require [re-frame.core :as re-frame]
            [reagent.core :as r]
            [auto-ap.events :as events]
            [auto-ap.subs :as subs]
            [auto-ap.views.utils :refer [with-keys]]))

(defn modal [{:keys [title foot hide-event]} & body]
  [:div.modal.is-active
   [:div.modal-background {:on-click (fn [] (re-frame/dispatch hide-event ))}]
   
   [:div.modal-card
    [:header.modal-card-head
     [:p.modal-card-title
      title]
     [:button.delete {:on-click (fn [] (re-frame/dispatch hide-event))}]]
    (into [:section.modal-card-body]
          (r/children (r/current-component)))
    
    (when foot
      [:footer.modal-card-foot
       foot])]])

(defn action-modal [{:keys [title action-text id save-event can-submit?] :or {can-submit? true}} & rest]
  (let [{:keys [visible? saving? error-message]} @(re-frame/subscribe [::subs/modal-state id])]
    (when visible?
      (-> [modal {:title [:span title
                          ]
                  :foot [:input.button.is-primary {:type "submit"
                                                   :tabindex "1"
                                                   :form id
                                                   :disabled (cond saving?
                                                                   "disabled"

                                                                   (not can-submit?)
                                                                   "disabled"

                                                                   :else
                                                                   "")
                                                   :class (when saving?
                                                            "is-loading")
                                                   :value action-text}
                           ]
                    :id id
                  :hide-event [::events/modal-status id {:visible? false}]}
           (into [:form {:id id
                         :on-submit (fn [e]
                                      (.preventDefault e)
                                      (re-frame/dispatch [::events/modal-status id {:saving? true :error-message nil}])
                                      (re-frame/dispatch save-event))}
                  (when error-message
                    [:div.notification.is-warning error-message])]

                 (r/children (r/current-component)) )]
          (into [(when saving? [:div.is-overlay {:style {"backgroundColor" "rgba(150,150,150, 0.5)"}}])])))))
