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

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

  alias Mobilizon.Actors.Actor
  alias Mobilizon.Actors.Follower, as: FollowerModel

  alias Mobilizon.Federation.ActivityStream.Convertible

  defimpl Convertible, for: FollowerModel do
    alias Mobilizon.Federation.ActivityStream.Converter.Follower,
      as: FollowerConverter

    defdelegate model_to_as(follower), to: FollowerConverter
  end

  @doc """
  Convert an follow struct to an ActivityStream representation.
  """
  @spec model_to_as(FollowerModel.t()) :: map
  def model_to_as(
        %FollowerModel{actor: %Actor{} = actor, target_actor: %Actor{} = target_actor} = follower
      ) do
    %{
      "type" => "Follow",
      "actor" => actor.url,
      "to" => [target_actor.url],
      "cc" => ["https://www.w3.org/ns/activitystreams#Public"],
      "object" => target_actor.url,
      "id" => follower.url
    }
  end
end