lib/responses/instruments/bank_account_details.ex

defmodule Responses.Instruments.BankAccountDetails do
  @moduledoc false
  alias Customers.AccountHolder
  alias Instruments.Bank

  @derive Jason.Encoder

  @type t() :: %__MODULE__{
          account_holder: AccountHolder.t(),
          account_number: String.t(),
          account_type: String.t(),
          bank: Bank.t(),
          bban: String.t(),
          bank_code: String.t(),
          branch_code: String.t(),
          country: <<_::2>>,
          currency: <<_::3>>,
          customer: %{
            default: true | false,
            email: String.t(),
            id: String.t(),
            name: String.t()
          },
          fingerprint: String.t(),
          iban: String.t(),
          id: String.t(),
          swift_bic: String.t(),
          type: String.t()
        }

  defstruct [
    :account_holder,
    :account_number,
    :account_type,
    :bank,
    :bban,
    :bank_code,
    :branch_code,
    :country,
    :currency,
    :customer,
    :fingerprint,
    :iban,
    :id,
    :swift_bic,
    :type
  ]

  def build(params) when is_map(params) do
    %__MODULE__{
      account_holder: AccountHolder.build(params["account_holder"]),
      account_number: params["account_number"],
      account_type: params["account_type"],
      bank: Bank.build(params["bank"]),
      bban: params["bban"],
      bank_code: params["bank_code"],
      branch_code: params["branch_code"],
      country: params["country"],
      currency: params["currency"],
      customer: build_customer(params["customer"]),
      fingerprint: params["fingerprint"],
      iban: params["iban"],
      id: params["id"],
      swift_bic: params["swift_bic"],
      type: params["type"]
    }
  end

  def build(_), do: nil

  defp build_customer(params) when is_map(params) do
    %{
      default: params["default"],
      email: params["email"],
      id: params["id"],
      name: params["name"]
    }
  end

  defp build_customer(_), do: nil
end