(ns auto-ap.routes.graphql
  (:require [auto-ap.routes.utils :refer [wrap-secure wrap-spec]]
            [auto-ap.graphql :as ql]
            [buddy.auth :refer [throw-unauthorized]]
            [clojure.edn :as edn]
            [compojure.core :refer [GET PUT context defroutes
                                    wrap-routes]]))


(defroutes routes
  (wrap-routes
   (context "/graphql" []
            (GET "/" {:keys [query-params] :as r}
                 (when (= "none" (:user/role (:identity r)))
                   (throw-unauthorized))

                 (try
                   (let [variables (some-> (query-params "variables")
                                           edn/read-string)]
                     {:status 200
                      :body (pr-str (ql/query (:identity r) (query-params "query") variables ))
                      :headers {"Content-Type" "application/edn"}})
                   (catch Exception e
                     (if-let [result (:result (ex-data e))]
                       {:status 400
                        :body (pr-str result)
                        :headers {"Content-Type" "application/edn"}}
                       (if-let [message (:validation-error (ex-data e) )]
                         {:status 400
                          :body (pr-str {:errors [(merge {:message message} (ex-data e))]})
                          :headers {"Content-Type" "application/edn"}}
                         {:status 500
                          :body (pr-str {:errors [(merge {:message (.getMessage e)} (ex-data e))]})
                          :headers {"Content-Type" "application/edn"}}))))))
   wrap-secure))
