;; Blog post detail components

(defcomp ~detail/edit-link (&key (href :as string) (hx-select :as string))
  (a :href href :sx-get href :sx-target "#main-panel"
    :sx-select hx-select :sx-swap "outerHTML" :sx-push-url "true"
    :class "inline-block px-3 py-1 rounded-full text-sm font-semibold bg-stone-700 text-white hover:bg-stone-800 transition-colors"
    (i :class "fa fa-pencil mr-1") " Edit"))

(defcomp ~detail/draft (&key publish-requested edit)
  (div :class "flex items-center justify-center gap-2 mb-3"
    (span :class "inline-block px-3 py-1 rounded-full text-sm font-semibold bg-amber-100 text-amber-800" "Draft")
    (when publish-requested (span :class "inline-block px-3 py-1 rounded-full text-sm font-semibold bg-blue-100 text-blue-800" "Publish requested"))
    edit))

(defcomp ~detail/like-toggle (&key like-url hx-headers heart)
  (button :sx-post like-url :sx-swap "outerHTML"
    :sx-headers hx-headers :class "cursor-pointer" heart))

(defcomp ~detail/like (&key like-url hx-headers heart)
  (div :class "absolute top-2 right-2 z-10 text-8xl md:text-6xl"
    (~detail/like-toggle :like-url like-url :hx-headers hx-headers :heart heart)))

(defcomp ~detail/excerpt (&key (excerpt :as string))
  (div :class "w-full text-center italic text-3xl p-2" excerpt))

(defcomp ~detail/chrome (&key like excerpt at-bar)
  (<> like
      excerpt
      (div :class "hidden md:block" at-bar)))

(defcomp ~detail/main (&key draft chrome feature-image html-content sx-content)
  (<> (article :class "relative"
    draft
    chrome
    (when feature-image (div :class "mb-3 flex justify-center"
      (img :src feature-image :alt "" :class "rounded-lg w-full md:w-3/4 object-cover")))
    (if sx-content
      (div :class "blog-content p-2" sx-content)
      (when html-content (div :class "blog-content p-2" (~rich-text :html html-content)))))
    (div :class "pb-8")))

;; ---------------------------------------------------------------------------
;; Data-driven composition — replaces _post_main_panel_sx
;; ---------------------------------------------------------------------------

(defcomp ~detail/post-detail-content (&key (slug :as string) (is-draft :as boolean) (publish-requested :as boolean) (can-edit :as boolean) (edit-href :as string?)
                                         (is-page :as boolean) (has-user :as boolean) (liked :as boolean) (like-url :as string?) (csrf :as string?)
                                         (custom-excerpt :as string?) (tags :as list?) (authors :as list?)
                                         (feature-image :as string?) (html-content :as string?) (sx-content :as string?))
  (let* ((hx-select "#main-panel")
         (draft-sx (when is-draft
           (~detail/draft
             :publish-requested publish-requested
             :edit (when can-edit
               (~detail/edit-link :href edit-href :hx-select hx-select)))))
         (chrome-sx (when (not is-page)
           (~detail/chrome
             :like (when has-user
               (~detail/like
                 :like-url like-url
                 :hx-headers {:X-CSRFToken csrf}
                 :heart (if liked "❤️" "🤍")))
             :excerpt (when (not (= custom-excerpt ""))
               (~detail/excerpt :excerpt custom-excerpt))
             :at-bar (~cards/at-bar :tags tags :authors authors)))))
    (~detail/main
      :draft draft-sx
      :chrome chrome-sx
      :feature-image feature-image
      :html-content html-content
      :sx-content sx-content)))

(defcomp ~detail/meta (&key (robots :as string) (page-title :as string) (desc :as string) (canonical :as string?) (og-type :as string) (og-title :as string) (image :as string?) (twitter-card :as string) (twitter-title :as string))
  (<>
    (meta :name "robots" :content robots)
    (title page-title)
    (meta :name "description" :content desc)
    (when canonical (link :rel "canonical" :href canonical))
    (meta :property "og:type" :content og-type)
    (meta :property "og:title" :content og-title)
    (meta :property "og:description" :content desc)
    (when canonical (meta :property "og:url" :content canonical))
    (when image (meta :property "og:image" :content image))
    (meta :name "twitter:card" :content twitter-card)
    (meta :name "twitter:title" :content twitter-title)
    (meta :name "twitter:description" :content desc)
    (when image (meta :name "twitter:image" :content image))))

(defcomp ~detail/home-main (&key html-content sx-content)
  (article :class "relative"
    (if sx-content
      (div :class "blog-content p-2" sx-content)
      (div :class "blog-content p-2" (~rich-text :html html-content)))))
