lib/api/limits.ex

defmodule ExTier.Api.Limits do
  alias ExTier.{Client, Error, Limits, Usage, Utils}

  @type limits_params :: %{
          :org => String.t()
        }

  @type limit_params :: %{
          :org => String.t(),
          :feature => String.t()
        }

  @doc """
  List the limits & usage of a given organization

      {:ok, %ExTier.Usage{}} = ExTier.limit(%{org: "org:org_id"})

  """
  @spec limits(limits_params) :: {:ok, Limits.t()} | {:error, Error.t()}
  def limits(params) do
    Client.get("/limits", query: params) |> Utils.cast(Limits)
  end

  @doc """
  List the limits & usage of a given organization's feature

      {:ok, %ExTier.Usage{}} = ExTier.limit(%{org: "org:org_id", feature: "feature:feature_name"})

  """
  @spec limit(limit_params) :: {:ok, Usage.t()} | {:error, Error.t()}
  def limit(params) do
    with {:ok, regex} <- Regex.compile("^#{params.feature}(@plan:.+)?$"),
         {:ok, limits} <- params |> Map.drop([:feature]) |> limits() do
      limits.usage
      |> Enum.find(&String.match?(&1.feature, regex))
      |> case do
        nil ->
          {:ok, %Usage{feature: params.feature, used: 0, limit: 0}}

        usage ->
          {:ok, usage}
      end
    else
      error -> error
    end
  end
end