;; Container-cards fragment handler
;;
;; Returns HTML with <!-- card-widget:ID --> comment markers so the
;; blog consumer can split per-post fragments.  Each post section
;; contains an events-frag-entries-widget with entry cards.

(defhandler container-cards (&key post_ids post_slugs)
  (let ((ids   (filter (fn (x) (> x 0))
                 (map parse-int
                   (filter (fn (s) (not (empty? s)))
                     (split (or post_ids "") ",")))))
        (slugs (map trim
                 (split (or post_slugs "") ","))))
    (when (not (empty? ids))
      (let ((batch (service "calendar" "confirmed-entries-for-posts" :post-ids ids)))
        (<> (map-indexed (fn (i pid)
          (let ((entries   (or (get batch pid) (list)))
                (post-slug (or (nth slugs i) "")))
            (<> (str "<!-- card-widget:" pid " -->")
                (when (not (empty? entries))
                  (~events-frag-entries-widget
                    :cards (<> (map (fn (e)
                      (let ((time-str (str (format-date (get e "start_at") "%H:%M")
                                          (if (get e "end_at")
                                            (str " \u2013 " (format-date (get e "end_at") "%H:%M"))
                                            ""))))
                        (~events-frag-entry-card
                          :href (app-url "events"
                                  (str "/" post-slug
                                       "/" (get e "calendar_slug")
                                       "/" (get e "start_at_year")
                                       "/" (get e "start_at_month")
                                       "/" (get e "start_at_day")
                                       "/entries/" (get e "id") "/"))
                          :name (get e "name")
                          :date-str (format-date (get e "start_at") "%a, %b %d")
                          :time-str time-str))) entries))))
                (str "<!-- /card-widget:" pid " -->")))) ids))))))
