lib/bling_paddle.ex

defmodule Bling.Paddle do
  @type customer :: any

  @callback paddle_customer_info(customer) :: map
  @callback handle_paddle_webhook_event(term) :: any

  def bling do
    Application.get_env(:bling_paddle, :bling)
  end

  def repo do
    Application.get_env(:bling_paddle, :repo)
  end

  def customers do
    Application.get_env(:bling_paddle, :customers, [])
  end

  def subscription do
    Application.get_env(:bling_paddle, :subscription)
  end

  def receipt do
    Application.get_env(:bling_paddle, :receipt)
  end

  def currency do
    Application.get_env(:bling_paddle, :paddle, [])
    |> Keyword.get(:currency, "USD")
  end

  def module_from_customer_type(type) do
    Enum.find_value(customers(), fn {name, mod} ->
      if to_string(name) == to_string(type), do: mod, else: nil
    end)
  end

  def customer_type_from_struct(customer) do
    Enum.find_value(customers(), fn {name, mod} ->
      if customer.__struct__ == mod, do: to_string(name), else: nil
    end)
  end

  def script_tags() do
    vendor_id = Application.get_env(:bling_paddle, :paddle)[:vendor_id]
    sandbox? = Application.get_env(:bling_paddle, :paddle)[:sandbox] || false
    sandbox_str = if sandbox?, do: "Paddle.Environment.set('sandbox');", else: ""

    """
    <script src="https://cdn.paddle.com/paddle/paddle.js"></script>
    <script type="text/javascript">
      #{sandbox_str}

      Paddle.Setup({ vendor: #{vendor_id} });
    </script>
    """
  end

  def deactivate_past_due?() do
    opts = Application.get_env(:bling_paddle, :paddle, [])
    val = Keyword.get(opts, :deactivate_past_due?, true)

    val == true
  end
end