defmodule Mobilizon.GraphQL.Schema.Actors.FollowerType do
  @moduledoc """
  Schema representation for Follower
  """
  use Absinthe.Schema.Notation
  alias Mobilizon.GraphQL.Resolvers.Followers

  @desc """
  Represents an actor's follower
  """
  object :follower do
    meta(:authorize, :user)
    field(:id, :id, description: "The follow ID")
    field(:target_actor, :actor, description: "What or who the profile follows")
    field(:actor, :actor, description: "Which profile follows")

    field(:approved, :boolean,
      description: "Whether the follow has been approved by the target actor"
    )

    field(:notify, :boolean,
      description:
        "Whether the follower will be notified by the target actor's activity or not (applicable for profile/group follows)"
    )

    field(:inserted_at, :datetime, description: "When the follow was created")
    field(:updated_at, :datetime, description: "When the follow was updated")
  end

  @desc """
  A paginated list of follower objects
  """
  object :paginated_follower_list do
    meta(:authorize, :user)
    field(:elements, list_of(:follower), description: "A list of followers")
    field(:total, :integer, description: "The total number of elements in the list")
  end

  object :follower_mutations do
    @desc "Update follower"
    field :update_follower, :follower do
      arg(:id, non_null(:id), description: "The follower ID")

      arg(:approved, non_null(:boolean),
        description: "Whether the follower has been approved by the target actor or not"
      )

      middleware(Rajska.QueryAuthorization, permit: :user, scope: false)

      resolve(&Followers.update_follower/3)
    end
  end
end
