defmodule Mobilizon.Events.Categories do
  @moduledoc """
  Module that handles event categories
  """
  import Mobilizon.Web.Gettext

  @default "MEETING"

  @spec default :: String.t()
  def default do
    @default
  end

  @spec list :: [%{id: atom(), label: String.t()}]
  def list do
    build_in_categories() ++ extra_categories()
  end

  @spec get_category(String.t() | nil) :: String.t()
  def get_category(category) do
    if category in Enum.map(list(), &String.upcase(to_string(&1.id))) do
      category
    else
      default()
    end
  end

  defp build_in_categories do
    [
      %{
        id: :arts,
        label: gettext("Arts")
      },
      %{
        id: :book_clubs,
        label: gettext("Book clubs")
      },
      %{
        id: :business,
        label: gettext("Business")
      },
      %{
        id: :causes,
        label: gettext("Causes")
      },
      %{
        id: :comedy,
        label: gettext("Comedy")
      },
      %{
        id: :crafts,
        label: gettext("Crafts")
      },
      %{
        id: :food_drink,
        label: gettext("Food & Drink")
      },
      %{
        id: :health,
        label: gettext("Health")
      },
      %{
        id: :music,
        label: gettext("Music")
      },
      %{
        id: :auto_boat_air,
        label: gettext("Auto, boat and air")
      },
      %{
        id: :community,
        label: gettext("Community")
      },
      %{
        id: :family_education,
        label: gettext("Family & Education")
      },
      %{
        id: :fashion_beauty,
        label: gettext("Fashion & Beauty")
      },
      %{
        id: :film_media,
        label: gettext("Film & Media")
      },
      %{
        id: :games,
        label: gettext("Games")
      },
      %{
        id: :language_culture,
        label: gettext("Language & Culture")
      },
      %{
        id: :learning,
        label: gettext("Learning")
      },
      %{
        id: :lgbtq,
        label: gettext("LGBTQ")
      },
      %{
        id: :movements_politics,
        label: gettext("Movements and politics")
      },
      %{
        id: :networking,
        label: gettext("Networking")
      },
      %{
        id: :party,
        label: gettext("Party")
      },
      %{
        id: :performing_visual_arts,
        label: gettext("Performing & Visual Arts")
      },
      %{
        id: :pets,
        label: gettext("Pets")
      },
      %{
        id: :photography,
        label: gettext("Photography")
      },
      %{
        id: :outdoors_adventure,
        label: gettext("Outdoors & Adventure")
      },
      %{
        id: :spirituality_religion_beliefs,
        label: gettext("Spirituality, Religion & Beliefs")
      },
      %{
        id: :science_tech,
        label: gettext("Science & Tech")
      },
      %{
        id: :sports,
        label: gettext("Sports")
      },
      %{
        id: :theatre,
        label: gettext("Theatre")
      },
      # Legacy default value
      %{
        id: :meeting,
        label: gettext("Meeting")
      }
    ]
  end

  @spec extra_categories :: [%{id: atom(), label: String.t()}]
  defp extra_categories do
    :mobilizon
    |> Application.get_env(:instance)
    |> Keyword.get(:extra_categories, [])
  end
end