;; Blog nav-tree fragment handler
;; returns: sx
;;
;; Renders the full scrollable navigation menu bar with app icons.
;; Uses nav-tree I/O primitive to fetch menu nodes from the blog DB.

(defhandler nav-tree (&key app_name path)
  (let ((app       (or app_name ""))
        (cur-path  (or path "/"))
        (first-seg (first (filter (fn (s) (not (empty? s)))
                            (split (trim cur-path) "/"))))
        (items     (nav-tree))
        (nav-cls   "whitespace-nowrap flex items-center gap-2 rounded p-2 text-sm")

        ;; App slug → URL mapping
        (app-slugs (dict
          :cart     (app-url "cart" "/")
          :market   (app-url "market" "/")
          :events   (app-url "events" "/")
          :federation (app-url "federation" "/")
          :account  (app-url "account" "/")
          :artdag   (app-url "artdag" "/"))))

    (let ((item-sxs
            (<>
              ;; Nav items from DB
              (map (fn (item)
                (let ((item-slug (or (get item "slug") ""))
                      (href (or (get app-slugs item-slug)
                                (app-url "blog" (str "/" item-slug "/"))))
                      (selected (or (= item-slug (or first-seg ""))
                                    (= item-slug app))))
                  (~shared:nav/blog-nav-item-link
                    :href href
                    :hx-get href
                    :selected (if selected "true" "false")
                    :nav-cls nav-cls
                    :img (~shared:misc/img-or-placeholder
                           :src (get item "feature_image")
                           :alt (or (get item "label") item-slug)
                           :size-cls "w-8 h-8 rounded-full object-cover flex-shrink-0")
                    :label (or (get item "label") item-slug)))) items)

              ;; Hardcoded artdag link
              (~shared:nav/blog-nav-item-link
                :href (app-url "artdag" "/")
                :hx-get (app-url "artdag" "/")
                :selected (if (or (= "artdag" (or first-seg ""))
                                  (= "artdag" app)) "true" "false")
                :nav-cls nav-cls
                :img (~shared:misc/img-or-placeholder
                       :src nil :alt "art-dag"
                       :size-cls "w-8 h-8 rounded-full object-cover flex-shrink-0")
                :label "art-dag")))

          ;; Scroll wrapper IDs + hyperscript
          (arrow-cls    "scrolling-menu-arrow-menu-items-container")
          (cid          "menu-items-container")
          (left-hs      (str "on click set #" cid ".scrollLeft to #" cid ".scrollLeft - 200"))
          (scroll-hs    (str "on scroll "
                             "set cls to '" arrow-cls "' "
                             "set arrows to document.getElementsByClassName(cls) "
                             "set show to (window.innerWidth >= 640 and "
                             "my.scrollWidth > my.clientWidth) "
                             "repeat for arrow in arrows "
                             "if show remove .hidden from arrow add .flex to arrow "
                             "else add .hidden to arrow remove .flex from arrow end "
                             "end"))
          (right-hs     (str "on click set #" cid ".scrollLeft to #" cid ".scrollLeft + 200")))

      (if (empty? items)
        (~shared:nav/blog-nav-empty :wrapper-id "menu-items-nav-wrapper")
        (~shared:misc/scroll-nav-wrapper
          :wrapper-id "menu-items-nav-wrapper"
          :container-id cid
          :arrow-cls arrow-cls
          :left-hs left-hs
          :scroll-hs scroll-hs
          :right-hs right-hs
          :items item-sxs
          :oob true)))))
