;; Notification components

(defcomp ~federation-notification-preview (&key preview)
  (div :class "text-sm text-stone-500 mt-1 truncate" preview))

(defcomp ~federation-notification-card (&key cls avatar from-name from-username from-domain action-text preview time)
  (div :class cls
    (div :class "flex items-start gap-3"
      avatar
      (div :class "flex-1"
        (div :class "text-sm"
          (span :class "font-semibold" from-name)
          " " (span :class "text-stone-500" "@" from-username from-domain)
          " " (span :class "text-stone-600" action-text))
        preview
        (div :class "text-xs text-stone-400 mt-1" time)))))

(defcomp ~federation-notifications-list (&key items)
  (div :class "space-y-2" items))

(defcomp ~federation-notifications-page (&key notifs)
  (h1 :class "text-2xl font-bold mb-6" "Notifications") notifs)

;; Assembled notification card — replaces Python _notification_sx
(defcomp ~federation-notification-from-data (&key notif)
  (let* ((from-name (or (get notif "from_actor_name") "?"))
         (from-username (or (get notif "from_actor_username") ""))
         (from-domain (or (get notif "from_actor_domain") ""))
         (from-icon (get notif "from_actor_icon"))
         (ntype (or (get notif "notification_type") ""))
         (preview (get notif "target_content_preview"))
         (created (or (get notif "created_at_formatted") ""))
         (read (get notif "read"))
         (app-domain (or (get notif "app_domain") ""))
         (border (if (not read) " border-l-4 border-l-stone-400" ""))
         (initial (if (and (not from-icon) from-name)
                    (upper (slice from-name 0 1)) "?"))
         (action-text (cond
           ((= ntype "follow") (str "followed you"
             (if (and app-domain (!= app-domain "federation"))
               (str " on " (escape app-domain)) "")))
           ((= ntype "like") "liked your post")
           ((= ntype "boost") "boosted your post")
           ((= ntype "mention") "mentioned you")
           ((= ntype "reply") "replied to your post")
           (true ""))))
    (~federation-notification-card
      :cls (str "bg-white rounded-lg shadow-sm border border-stone-200 p-4" border)
      :avatar (~avatar
        :src from-icon
        :cls (if from-icon "w-8 h-8 rounded-full"
               "w-8 h-8 rounded-full bg-stone-300 flex items-center justify-center text-stone-600 font-bold text-xs")
        :initial (when (not from-icon) initial))
      :from-name (escape from-name)
      :from-username (escape from-username)
      :from-domain (if from-domain (str "@" (escape from-domain)) "")
      :action-text action-text
      :preview (when preview (~federation-notification-preview :preview (escape preview)))
      :time created)))

;; Assembled notifications content — replaces Python _notifications_content_sx
(defcomp ~federation-notifications-content (&key notifications)
  (~federation-notifications-page
    :notifs (if (empty? notifications)
      (~empty-state :message "No notifications yet." :cls "text-stone-500")
      (~federation-notifications-list
        :items (map (lambda (n)
          (~federation-notification-from-data :notif n))
          notifications)))))
