defmodule Mobilizon.Federation.ActivityStream.Converter.Participant do
  @moduledoc """
  Participant converter.

  This module allows to convert reports from ActivityStream format to our own
  internal one, and back.
  """

  alias Mobilizon.Events.Participant, as: ParticipantModel

  alias Mobilizon.Federation.ActivityStream.Convertible

  defimpl Convertible, for: ParticipantModel do
    alias Mobilizon.Federation.ActivityStream.Converter.Participant, as: ParticipantConverter

    defdelegate model_to_as(participant), to: ParticipantConverter
  end

  @doc """
  Convert an event struct to an ActivityStream representation.
  """
  @spec model_to_as(ParticipantModel.t()) :: map
  def model_to_as(%ParticipantModel{} = participant) do
    %{
      "type" => "Join",
      "id" => participant.url,
      "actor" => participant.actor.url,
      "object" => participant.event.url,
      "participationMessage" => Map.get(participant.metadata, :message)
    }
  end
end