;; Relations container-nav fragment handler
;; returns: sx
;;
;; Generic navigation fragment driven by the relation registry.
;; Renders nav items for all related entities of a container.

(defhandler container-nav (&key container_type container_id post_slug nav_class exclude)
  (let ((ct          (or container_type "page"))
        (cid         (parse-int (or container_id "0")))
        (slug        (or post_slug ""))
        (ncls        (or nav_class ""))
        (excl-raw    (or exclude ""))
        (excl-set    (filter (fn (e) (not (empty? e)))
                       (map trim (split excl-raw ","))))

        ;; URL builders per child type
        (url-builders (dict :calendar "events" :market "market"))

        ;; Filter relation defs: visible + not excluded
        (nav-defs    (filter (fn (d)
                       (and (!= (get d "nav") "hidden")
                            (not (contains? excl-set (get d "name")))))
                       (relations-from ct))))

    (when (not (empty? nav-defs))
      (let ((parts (map (fn (defn)
              (let ((children (get-children
                                :parent-type ct
                                :parent-id cid
                                :child-type (get defn "to_type")
                                :relation-type (get defn "name"))))
                (<> (map (fn (child)
                  (let ((child-slug (or (get (or (get child "metadata_") (dict)) "slug") "")))
                    (when (not (empty? child-slug))
                      (let ((path (if (not (empty? slug))
                                    (str "/" slug "/" child-slug "/")
                                    (str "/" child-slug "/")))
                            (svc-name (get url-builders (get defn "to_type")))
                            (href (if svc-name
                                    (app-url svc-name path)
                                    path)))
                        (~shared:navigation/relation-nav
                          :href href
                          :name (or (get child "label") "")
                          :icon (or (get defn "nav_icon") "")
                          :nav-class ncls
                          :relation-type (get defn "name")))))) children)))) nav-defs)))
        (<> parts)))))
