defmodule MobilizonWeb.Resolvers.Category do
  @moduledoc """
  Handles the category-related GraphQL calls
  """
  require Logger
  alias Mobilizon.Actors.User

  ###
  # TODO : Refactor this into MobilizonWeb.API.Categories when a standard AS category is defined
  ###
  def list_categories(_parent, %{page: page, limit: limit}, _resolution) do
    categories =
      Mobilizon.Events.list_categories(page, limit)
      |> Enum.map(fn category ->
        urls = MobilizonWeb.Uploaders.Category.urls({category.picture, category})
        Map.put(category, :picture, %{url: urls.original, url_thumbnail: urls.thumb})
      end)

    {:ok, categories}
  end

  def create_category(_parent, %{title: title, picture: picture, description: description}, %{
        context: %{current_user: %User{} = _user}
      }) do
    with {:ok, category} <-
           Mobilizon.Events.create_category(%{
             title: title,
             description: description,
             picture: picture
           }),
         urls <- MobilizonWeb.Uploaders.Category.urls({category.picture, category}) do
      Logger.info("Created category " <> title)
      {:ok, Map.put(category, :picture, %{url: urls.original, url_thumbnail: urls.thumb})}
    else
      {:error, %Ecto.Changeset{errors: errors} = _changeset} ->
        # This is pretty ridiculous for changeset to error
        errors =
          Enum.into(errors, %{})
          |> Enum.map(fn {key, {value, _}} -> Atom.to_string(key) <> ": " <> value end)

        {:error, errors}
    end
  end

  def create_category(_parent, _args, %{}) do
    {:error, "You are not allowed to create a category if not connected"}
  end
end