lib/pgflow_dashboard/components/run_history_helpers.ex

defmodule PgFlowDashboard.Components.RunHistoryHelpers do
  @moduledoc false

  use Phoenix.Component

  attr(:cells, :list, required: true)
  attr(:base_path, :string, required: true)

  @doc false
  def run_history_grid(assigns) do
    cells = Enum.reverse(assigns.cells)
    assigns = assign(assigns, :cells, cells)

    ~H"""
    <div class="overflow-x-auto">
      <%= if @cells == [] do %>
        <p class="text-sm text-slate-500 dark:text-slate-400">No run history yet</p>
      <% else %>
        <div class="flex flex-wrap gap-1">
          <%= for cell <- @cells do %>
            <.link
              navigate={"#{@base_path}/runs/#{cell.run_id}"}
              class="w-4 h-4 rounded-sm transition-all hover:scale-125 hover:z-10 block focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-1"
              style={"background-color: #{cell_color(cell.status)}"}
              title={cell_tooltip(cell)}
            ></.link>
          <% end %>
        </div>

        <div class="mt-4 flex items-center gap-4 text-sm text-slate-500 dark:text-slate-400">
          <div class="flex items-center gap-1.5">
            <div class="w-4 h-4 rounded-sm bg-emerald-500"></div>
            <span>Completed</span>
          </div>
          <div class="flex items-center gap-1.5">
            <div class="w-4 h-4 rounded-sm bg-rose-500"></div>
            <span>Failed</span>
          </div>
          <div class="flex items-center gap-1.5">
            <div class="w-4 h-4 rounded-sm bg-sky-500"></div>
            <span>Running</span>
          </div>
        </div>
      <% end %>
    </div>
    """
  end

  @doc false
  def cell_color(status) do
    case status do
      s when s in [:completed, "completed"] -> "#10b981"
      s when s in [:failed, "failed"] -> "#ef4444"
      s when s in [:started, "started"] -> "#0ea5e9"
      _ -> "#cbd5e1"
    end
  end

  @doc false
  def format_duration_ms(nil), do: "-"
  def format_duration_ms(%Decimal{} = d), do: "#{round(Decimal.to_float(d))}ms"
  def format_duration_ms(ms) when is_float(ms), do: "#{round(ms)}ms"
  def format_duration_ms(ms) when is_integer(ms), do: "#{ms}ms"

  defp cell_tooltip(cell) do
    duration = format_duration_ms(cell.duration_ms)
    "Run #{String.slice(cell.run_id, 0..7)}\nStatus: #{cell.status}\nDuration: #{duration}"
  end
end