lib/omise/link.ex

defmodule Omise.Link do
  @moduledoc ~S"""
  Provides Link API interfaces.

  <https://www.omise.co/links-api>
  """

  use Omise.HTTPClient, endpoint: "links"

  defstruct object: "link",
            id: nil,
            livemode: nil,
            location: nil,
            amount: nil,
            currency: nil,
            used: nil,
            multiple: nil,
            title: nil,
            description: nil,
            charges: %Omise.List{data: [%Omise.Charge{}]},
            payment_uri: nil,
            created: nil

  @type t :: %__MODULE__{
          object: String.t(),
          id: String.t(),
          livemode: boolean,
          location: String.t(),
          amount: integer,
          currency: String.t(),
          used: boolean,
          multiple: boolean,
          title: String.t(),
          description: String.t(),
          charges: Omise.List.t(),
          payment_uri: String.t(),
          created: String.t()
        }

  @doc ~S"""
  List all links.

  Returns `{:ok, links}` if the request is successful, `{:error, error}` otherwise.

  ## Examples

      Omise.Link.list

      Omise.Link.list(limit: 10, order: "reverse_chronological")

  """
  @spec list(Keyword.t(), Keyword.t()) :: {:ok, Omise.List.t()} | {:error, Omise.Error.t()}
  def list(params \\ [], opts \\ []) do
    opts = Keyword.merge(opts, as: %Omise.List{data: [%__MODULE__{}]})
    get(@endpoint, params, opts)
  end

  @doc ~S"""
  Retrieve a link.

  ## Examples

      Omise.Link.retrieve("link_test_55s7oubg54yln9ey2h4")

  """
  @spec retrieve(String.t(), Keyword.t()) :: {:ok, t} | {:error, Omise.Error.t()}
  def retrieve(id, opts \\ []) do
    opts = Keyword.merge(opts, as: %__MODULE__{})
    get("#{@endpoint}/#{id}", [], opts)
  end

  @doc ~S"""
  Create a link.

  Returns `{:ok, link}` if the request is successful, `{:error, error}` otherwise.

  ## Examples

      # For one time use
      Omise.Link.create(
        amount: 1000_00,
        currency: "thb",
        title: "Awesome Elixir",
        description: "This book will teach you about Elixir Programming Language"
      )

      # For multiple time use
      Omise.Link.create(
        amount: 1000_00,
        currency: "thb",
        title: "Awesome Elixir",
        description: "This book will teach you about Elixir Programming Language"
        multiple: true
      )

  """
  @spec create(Keyword.t(), Keyword.t()) :: {:ok, t} | {:error, Omise.Error.t()}
  def create(params \\ [], opts \\ []) do
    opts = Keyword.merge(opts, as: %__MODULE__{})
    post(@endpoint, params, opts)
  end
end