defmodule Mobilizon.Federation.ActivityPub.Actions.Delete do
  @moduledoc """
  Delete things
  """
  alias Mobilizon.Actors.Actor
  alias Mobilizon.Federation.ActivityPub.Activity
  alias Mobilizon.Federation.ActivityPub.Types.{Entity, Managable, Ownable}
  require Logger

  import Mobilizon.Federation.ActivityPub.Utils,
    only: [
      create_activity: 2,
      maybe_federate: 1,
      maybe_relay_if_group_activity: 2,
      check_for_actor_key_rotation: 1
    ]

  @doc """
  Delete an entity, using an activity of type `Delete`
  """
  @spec delete(Entity.t(), Actor.t(), boolean, map) :: {:ok, Activity.t(), Entity.t()}
  def delete(object, actor, local \\ true, additional \\ %{}) do
    with {:ok, activity_data, actor, object} <-
           Managable.delete(object, actor, local, additional),
         group <- Ownable.group_actor(object),
         :ok <- check_for_actor_key_rotation(actor),
         {:ok, activity} <- create_activity(activity_data, local),
         :ok <- maybe_federate(activity),
         :ok <- maybe_relay_if_group_activity(activity, group) do
      {:ok, activity, object}
    end
  end
end