defmodule Mobilizon.Federation.ActivityPub.Actions.Move do
  @moduledoc """
  Move things
  """
  alias Mobilizon.Resources.Resource
  alias Mobilizon.Federation.ActivityPub.{Activity, Types}
  require Logger

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

  @spec move(:resource, Resource.t(), map, boolean, map) ::
          {:ok, Activity.t(), Resource.t()} | {:error, Ecto.Changeset.t() | atom()}
  def move(type, old_entity, args, local \\ false, additional \\ %{}) do
    Logger.debug("We're moving something")
    Logger.debug(inspect(args))

    with {:ok, entity, update_data} <-
           (case type do
              :resource -> Types.Resources.move(old_entity, args, additional)
            end) do
      {:ok, activity} = create_activity(update_data, local)
      maybe_federate(activity)
      {:ok, activity, entity}
    end
  end
end