(ns controllers.__table
  (:require [coast.utils :refer [try+]]
            [coast.responses :refer [flash redirect]]
            [models.__table]
            [views.__table])
            [routes]
  (:refer-clojure :exclude [update new]))

(defn params [request]
  (:params request))

(defn index [request]
  (let [__table (models.__table/all)
        request (assoc request :__table table)]
    (views.__table/index request)))

(defn show [request]
  (let [params (params request)
        __singular (models.__table/fetch params)]
        request (assoc request :__singular __singular)
    (views.__table/show request)))

(defn new [request]
  (views.__table/new request))

(defn create [request]
  (try+
    (let [__singular (models.__table/create request)]
      (-> (redirect (routes/url-for :__table/index))
          (flash "__singular created successfully")))
    (fn [ex]
      (views.__table/new (assoc request :errors (:errors ex))))))

(defn edit [request]
  (let [params (params request)
        __singular (models.__table/fetch params)
        request (assoc request :__singular singular)]
    (views.__table/edit request)))

(defn update [request]
  (try+
    (let [params (params request)
          __singular (models.__table/fetch params)
          __singular (merge __singular params)
          _ (models.__table/update __singular)]
      (-> (redirect (routes/url-for :__table/index))
          (flash "__singular updated successfully")))
    (fn [ex]
      (edit (assoc request :errors (:errors ex))))))

(defn delete [request]
  (try+
    (let [params (params request)
          {:keys [id]} (models.__table/fetch params)
          _ (models.__table/delete {:id id})]
      (-> (redirect (routes/url-for :__table/index))
          (flash "__singular deleted successfully")))
    (fn [ex]
      (-> (redirect (routes/url-for :__table/index))
          (flash "__singular could not be deleted")))))
