;; Account-page fragment handler
;;
;; Renders tickets or bookings panel for the account dashboard.
;; slug=tickets → ticket list; slug=bookings → booking list.

(defhandler account-page (&key slug user_id)
  (let ((uid (parse-int (or user_id "0"))))
    (when (> uid 0)
      (cond
        (= slug "tickets")
        (let ((tickets (service "calendar" "user-tickets" :user-id uid)))
          (~events-frag-tickets-panel
            :items (if (empty? tickets)
                    (~empty-state :message "No tickets yet."
                                 :cls "text-sm text-stone-500")
                    (~events-frag-tickets-list
                      :items (<> (map (fn (t)
                        (~events-frag-ticket-item
                          :href (app-url "events"
                                  (str "/tickets/" (get t "code") "/"))
                          :entry-name (get t "entry_name")
                          :date-str (format-date (get t "entry_start_at") "%d %b %Y, %H:%M")
                          :calendar-name (when (get t "calendar_name")
                                           (span (str "\u00b7 " (get t "calendar_name"))))
                          :type-name (when (get t "ticket_type_name")
                                      (span (str "\u00b7 " (get t "ticket_type_name"))))
                          :badge (~status-pill :status (or (get t "state") ""))))
                        tickets))))))

        (= slug "bookings")
        (let ((bookings (service "calendar" "user-bookings" :user-id uid)))
          (~events-frag-bookings-panel
            :items (if (empty? bookings)
                    (~empty-state :message "No bookings yet."
                                 :cls "text-sm text-stone-500")
                    (~events-frag-bookings-list
                      :items (<> (map (fn (b)
                        (~events-frag-booking-item
                          :name (get b "name")
                          :date-str (str (format-date (get b "start_at") "%d %b %Y, %H:%M")
                                        (if (get b "end_at")
                                          (str " \u2013 " (format-date (get b "end_at") "%H:%M"))
                                          ""))
                          :calendar-name (when (get b "calendar_name")
                                           (span (str "\u00b7 " (get b "calendar_name"))))
                          :cost-str (when (get b "cost")
                                      (span (str "\u00b7 \u00a3" (get b "cost"))))
                          :badge (~status-pill :status (or (get b "state") ""))))
                        bookings))))))))))
