(ns frontend.github
  (:require [frontend.util :as util]
            [cljs-bean.core :as bean]
            [goog.crypt.base64 :as b64]))

(defonce API "https://api.github.com/")

;; https://developer.github.com/v3/repos/contents/
;; GET /repos/:owner/:repo/contents/:path?ref=oid
;; header 'authorization: Basic PASSWORD'
(defn get-content
  [token repo-url path ref ok-handler error-handler]
  (let [[owner repo-name] (util/get-git-owner-and-repo repo-url)
        token (str "Basic " (b64/encodeString (str owner ":" token)))
        url (util/format (str API "repos/%s/%s/contents/%s?ref=%s")
                         owner
                         repo-name
                         path
                         ref)]
    (util/fetch-raw url
                    {:method "get"
                     :headers {:Accept "application/vnd.github.v3.raw"
                               :Content-Type "application/json"
                               :Authorization token}}
                    (fn [content]
                      (ok-handler
                       {:repo-url repo-url
                        :path path
                        :ref ref
                        :content content}))
                    (fn [error]
                      (error-handler error)))))

;; GET /repos/:owner/:repo/collaborators/:username/permission
(defn get-repo-permission
  [token repo-url current-user-name true-handler false-handler]
  (let [[owner repo-name] (util/get-git-owner-and-repo repo-url)
        token (str "Basic "(b64/encodeString (str owner ":" token)))
        url (util/format (str API "repos/%s/%s/collaborators/%s/permission")
                         owner
                         repo-name
                         current-user-name)]
    (util/fetch url
                (bean/->js {:method "get"
                            :headers {:Accept "application/json"
                                      :Content-Type "application/json"
                                      :Authorization token}})
                (fn [result] (true-handler result))
                (fn [error]
                  (false-handler)))))
