lib/pgflow_dashboard/components/health_badge.ex

defmodule PgFlowDashboard.Components.HealthBadge do
  @moduledoc """
  Health status badge component for workers.
  """

  use Phoenix.Component

  @doc """
  Renders a health status badge.

  ## Attributes

    * `:status` - The health status ("healthy", "stale", "dead")
    * `:size` - Badge size (:sm, :md). Default: :md

  """
  attr(:status, :string, required: true)
  attr(:size, :atom, default: :md, values: [:sm, :md])

  def health_badge(assigns) do
    {color, text} =
      case assigns.status do
        "healthy" ->
          {"bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400",
           "Healthy"}

        "stale" ->
          {"bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400", "Stale"}

        _ ->
          {"bg-slate-100 text-slate-600 dark:bg-slate-800 dark:text-slate-400", "Dead"}
      end

    assigns =
      assigns
      |> assign(:color, color)
      |> assign(:text, text)
      |> assign(:size_classes, size_classes(assigns.size))
      |> assign(:dot_classes, dot_classes(assigns.size))

    ~H"""
    <span class={["inline-flex items-center gap-1.5 font-medium rounded-full", @color, @size_classes]}>
      <span class={["rounded-full bg-current", @dot_classes]}></span>
      {@text}
    </span>
    """
  end

  defp size_classes(:sm), do: "px-2 py-0.5 text-xs"
  defp size_classes(:md), do: "px-2.5 py-1 text-sm"

  defp dot_classes(:sm), do: "w-1.5 h-1.5"
  defp dot_classes(:md), do: "w-2 h-2"
end