lib/config.ex

defmodule ExCheckout.Config do
  @doc """
  Return value by key from config.exs file.
  """

  alias ExCheckout.Carrier

  def get(name, default \\ nil) do
    Application.get_env(:ex_checkout, name, default)
  end

  def repo, do: List.first(Application.fetch_env!(:ex_checkout, :ecto_repos))
  def repos, do: Application.fetch_env!(:ex_checkout, :ecto_repos)

  @spec config() :: Keyword.t() | none()
  def config() do
    carriers = Application.get_env(:ex_checkout, :carriers, [])
    payment_providers = Application.get_env(:ex_checkout, :payment_providers, [])

    {carriers, payment_providers}
  end

  @spec carriers() :: [Carrier.t()]

  def carriers() do
    {data, _} = config()

    data
    |> Enum.map(fn {x, _} -> x end)
  end

  @spec carriers() :: [Carrier.t()]
  def carriers(nil) do
    {data, _} = config()

    data
    |> Enum.map(fn {x, _} -> x end)
  end

  @spec carriers(Tuple.t()) :: [Carrier.t()]
  def carriers({config, _}) do
    config
    |> Enum.map(fn {x, _} -> x end)
  end

  @spec payment_providers() :: [Map.t()]
  def payment_providers() do
    {_, data} = config()

    data
    |> Enum.map(fn {_, x} -> x end)
  end

  @spec payment_providers() :: [Map.t()]
  def payment_providers(nil) do
    {_, data} = config()

    data
    |> Enum.map(fn {x, _} -> x end)
  end

  @spec payment_providers(List.t()) :: [Map.t()]
  def payment_providers({_, config}) do
    config
    |> Enum.map(fn {x, _} -> x end)
  end
end