lib/api2pdf.ex

defmodule Api2pdf do
  @moduledoc File.read!("README.md")

  alias Api2pdf.Model.{
    ApiSuccessResponse,
    BalanceCheckSuccessResponse
  }

  @spec make_post_request(String.t(), struct, keyword) ::
          {:error, any} | {:ok, ApiSuccessResponse.t()} | {:ok, BalanceCheckSuccessResponse.t()}
  def make_post_request(endpoint, payload, options \\ []) do
    client = Application.get_env(:api2pdf, :client, Api2pdf.Client)
    client.post_request(endpoint, payload, options) |> handle_response()
  end

  @spec make_get_request(String.t(), keyword) ::
          {:error, any} | {:ok, ApiSuccessResponse.t()} | {:ok, BalanceCheckSuccessResponse.t()}
  def make_get_request(endpoint, options \\ []) do
    client = Application.get_env(:api2pdf, :client, Api2pdf.Client)
    client.get_request(endpoint, options) |> handle_response()
  end

  @doc """
  Utility command to check your balance on https://portal.api2pdf.com.

  https://app.swaggerhub.com/apis-docs/api2pdf/api2pdf/2.0.0#/Utility%20Commands/balanceCheck

  ## Examples
  ```elixir
  # api_key in config.exs
  Api2pdf.check_balance()

  # OR, api_key as option
  Api2pdf.check_balance(api_key: "YOUR-API-KEY")
  ```
  """
  @spec check_balance(keyword) ::
          {:error, any} | {:ok, BalanceCheckSuccessResponse.t()}
  def check_balance(options \\ []), do: make_get_request("/balance", options)

  # Response handling
  defp handle_response(%{body: %{"UserBalance" => _} = body}),
    do: {:ok, BalanceCheckSuccessResponse.from_body(body)}

  defp handle_response(%{body: %{"Error" => nil} = body}),
    do: {:ok, ApiSuccessResponse.from_body(body)}

  defp handle_response(%{body: %{"Error" => error}}), do: {:error, error}
  defp handle_response(%{body: error}) when is_binary(error), do: {:error, error}
  defp handle_response({:error, _} = error), do: error

  defp handle_response(_) do
    {:error, "unknown response format"}
  end
end