defmodule Mix.Tasks.Mobilizon.Users.Show do
  @moduledoc """
  Task to display an user details
  """

  use Mix.Task
  import Mix.Tasks.Mobilizon.Common
  alias Mobilizon.Actors.Actor
  alias Mobilizon.Users
  alias Mobilizon.Users.User

  @shortdoc "Show a Mobilizon user details"

  @impl Mix.Task
  def run([email]) do
    start_mobilizon()

    with {:ok, %User{} = user} <- Users.get_user_by_email(email),
         actors <- Users.get_actors_for_user(user) do
      status =
        case user.confirmed_at do
          %DateTime{} = confirmed_at ->
            "Activated on #{DateTime.to_string(confirmed_at)} (UTC)"

          _ ->
            "disabled"
        end

      shell_info("""
      Informations for the user #{user.email}:
        - account status: #{status}
        - Role: #{user.role}
        #{display_actors(actors)}
      """)
    else
      {:error, :user_not_found} ->
        shell_error("Error: No such user")
    end
  end

  def run(_) do
    shell_error("mobilizon.users.show requires an email as argument")
  end

  defp display_actors([]), do: ""

  defp display_actors(actors) do
    """
    Identities (#{length(actors)}):
    #{Enum.map_join(actors, &display_actor/1)}
    """
  end

  defp display_actor(%Actor{} = actor) do
    """
        - @#{actor.preferred_username} / #{actor.name}
    """
  end
end