lib/plan.ex

defmodule Braintree.Plan do
  @moduledoc """
  Plans represent recurring billing plans in a Braintree merchant account.
  The API for plans is read only.

  For additional reference see:
  https://developers.braintreepayments.com/reference/request/plan/all/ruby
  """

  use Braintree.Construction

  alias Braintree.ErrorResponse, as: Error
  alias Braintree.HTTP

  @type t :: %__MODULE__{
          id: String.t(),
          add_ons: [any],
          balance: String.t(),
          billing_day_of_month: String.t(),
          billing_frequency: String.t(),
          created_at: String.t(),
          currency_iso_code: String.t(),
          description: String.t(),
          discounts: [any],
          name: String.t(),
          number_of_billing_cycles: String.t(),
          price: String.t(),
          trial_duration: String.t(),
          trial_duration_unit: String.t(),
          trial_period: String.t(),
          updated_at: String.t()
        }

  defstruct id: nil,
            add_ons: [],
            balance: nil,
            billing_day_of_month: nil,
            billing_frequency: nil,
            created_at: nil,
            currency_iso_code: nil,
            description: nil,
            discounts: [],
            name: nil,
            number_of_billing_cycles: nil,
            price: nil,
            trial_duration: nil,
            trial_duration_unit: nil,
            trial_period: nil,
            updated_at: nil

  @doc """
  Get a list of all the plans defined in the merchant account. If there are
  no plans an empty list is returned.

  ## Example

      {:ok, plans} = Braintree.Plan.all()
  """
  @spec all(Keyword.t()) :: {:ok, [t]} | {:error, Error.t()}
  def all(opts \\ []) do
    with {:ok, %{"plans" => plans}} <- HTTP.get("plans", opts) do
      {:ok, new(plans)}
    end
  end
end