(ns thxgh
  {:clj-kondo/config '{:lint-as {promesa.core/let clojure.core/let}}}
  (:require [promesa.core :as p]
            [nbb.core :refer [*file* invoked-file]]))

(def urls
  {:repos "https://api.github.com/users/%s/repos?per_page=100"})

(defn fetch-json [url]
  (p/let [resp (js/fetch url)
          json (.json resp)]
    json))

(defn repos-keep-keys [repos]
  (map (fn [r]
         (select-keys (js->clj r :keywordize-keys true)
                      [:id :stargazers_count :watchers_count :updated_at
                       :created_at :full_name :name :description
                       :html_url :size :language :fork :forks_count
                       :forks :open_issues_count :open_issues :watchers
                       :clone_url :ssh_url]))
       repos))

(defn fetch-repos [username]
  (p/let [url (.replace (:repos urls) "%s" username)
          repos (fetch-json url)]
    (repos-keep-keys repos)))

(defn calculate-stats [repos]
  (let [langs (->> repos
                   (remove :fork)
                   (map :language)
                   (remove nil?)
                   frequencies)
        total (apply + (vals langs))
        sorted-langs (->> langs
                          (map (fn [[lang count]]
                                 {:language lang
                                  :count count
                                  :percent (js/Math.round (* (/ count total) 100))}))
                          (sort-by :count >))]
    {:timestamp (.toISOString (js/Date.))
     :languages sorted-langs}))

(defn main [args]
  (p/let [command (first args)
          username (second args)]
    (cond
      (= command "--stats")
      (p/let [repos (fetch-repos username)
              stats (calculate-stats repos)]
        (println (js/JSON.stringify (clj->js stats) nil 2)))

      :else
      (println "Usage: nbb thxgh.cljs --stats <username>"))))

(when (= *file* (invoked-file))
  (main *command-line-args*))
