lib/mobus/stepwise/components/stepwise_context_merge.ex

defmodule Mobus.Stepwise.Components.StepwiseContextMerge do
  @moduledoc """
  Merges inbound payload into `runtime.context` for stepwise workflows.

  Stepwise workflows are wizard-like; user input is typically collected over
  multiple events. This component ensures that payload updates persist in the
  in-band runtime context, enabling resume and later step actions.
  """

  @doc """
  Merges the event payload into `runtime.context`.

  This is an ALF pipeline stage. It shallow-merges `event.payload` into
  `runtime.context`, accumulating user input across successive events.
  Skipped when the event has an error status.

  ## Parameters

    * `event` — pipeline event map with `:runtime` and `:payload` keys
    * `opts` — ALF stage options (unused)

  ## Returns

    * Updated event map with merged context in `event.runtime.context`.

  """
  @spec call(map(), map()) :: map()
  def call(%{status: :error} = event, _opts), do: event

  def call(%{runtime: runtime, payload: payload} = event, _opts) when is_map(payload) do
    runtime =
      runtime
      |> Map.update(:context, %{}, fn ctx -> Map.merge(ctx, payload) end)

    %{event | runtime: runtime}
  end

  def call(event, _opts), do: event
end