lib/requests/payments/destinations/bank_account.ex

defmodule Requests.Payments.Destinations.BankAccount do
  alias  Customers.AccountHolder
  alias Customers.BillingAddress

  @type bank :: %{
          name: String.t(),
          branch: String.t(),
          address: BillingAddress.t()
        }

  @type t :: %__MODULE__{
          type: String.t(),
          account_type: String.t(),
          account_number: String.t(),
          bank_code: String.t(),
          branch_code: String.t(),
          iban: String.t(),
          bban: String.t(),
          swift_bic: String.t(),
          country: <<_::2>>,
          account_holder: AccountHolder.t(),
          bank: bank()
        }

  @enforce_keys [:type, :country]
  defstruct [
    :type,
    :account_type,
    :account_number,
    :bank_code,
    :branch_code,
    :iban,
    :bban,
    :swift_bic,
    :country,
    :account_holder,
    :bank
  ]

  def build(params) when is_map(params) do
    %{
      type: params[:type],
      account_type: params[:account_type],
      account_number: params[:account_type],
      bank_code: params[:bank_code],
      branch_code: params[:branch_code],
      iban: params[:iban],
      bban: params[:bban],
      swift_bic: params[:swift_bic],
      country: params[:country],
      account_holder: AccountHolder.build(params[:account_type]),
      bank: build_bank(params[:bank])
    }
  end

  def build(_), do: nil

  defp build_bank(params) when is_map(params) do
    %{
      name: params[:name],
      branch: params[:branch],
      address: BillingAddress.build(params[:address])
    }
  end

  defp build_bank(_), do: nil
end