# frozen_string_literal: true

module BadgesHelper
  # Creates a GitLab UI badge.
  #
  # Examples:
  #   # Plain text badge
  #   gl_badge_tag("foo")
  #
  #   # Danger variant
  #   gl_badge_tag("foo", variant: :danger)
  #
  #   # Small size
  #   gl_badge_tag("foo", size: :sm)
  #
  #   # With icon
  #   gl_badge_tag("foo", icon: "question-o")
  #
  #   # Icon-only
  #   gl_badge_tag("foo", icon: "question-o", icon_only: true)
  #
  #   # Badge link
  #   gl_badge_tag("foo", nil, href: some_path)
  #
  #   # Custom classes
  #   gl_badge_tag("foo", nil, class: "foo-bar")
  #
  #   # Block content
  #   gl_badge_tag({ variant: :danger }, { class: "foo-bar" }) do
  #     "foo"
  #   end
  #
  # For accessibility, ensure that the given text or block is non-empty.
  #
  # See also https://gitlab-org.gitlab.io/gitlab-ui/?path=/story/base-badge--default.
  def gl_badge_tag(*args, &block)
    # Merge the options and html_options hashes if both are present,
    # because the badge component wants a flat list of keyword args.
    args.compact!
    hashes, params = args.partition { |a| a.is_a? Hash }
    options_hash = hashes.reduce({}, :merge)

    if block
      render Pajamas::BadgeComponent.new(**options_hash), &block
    else
      render Pajamas::BadgeComponent.new(*params, **options_hash)
    end
  end
end
