lib/circlex/emulator/api/core/addresses_api.ex

defmodule Circlex.Emulator.Api.Core.AddressesApi do
  @moduledoc """
  Mounted under `/v1/businessAccount/wallet/addresses`.
  """
  use Circlex.Emulator.Api
  alias Circlex.Emulator.Api
  alias Circlex.Emulator.State.RecipientState
  alias Circlex.Struct.Recipient

  @route path: "/deposit", method: :post
  def generate_deposit_address(%{
        idempotencyKey: idempotency_key,
        currency: currency,
        chain: chain
      }) do
    with {:ok, master_wallet} <- get_master_wallet() do
      Api.Accounts.WalletsApi.generate_blockchain_address(%{
        wallet_id: master_wallet.wallet_id,
        idempotencyKey: idempotency_key,
        currency: currency,
        chain: chain
      })
    end
  end

  # https://developers.circle.com/reference/getbusinessaccountdepositaddresses
  @route "/deposit"
  def list_deposit_addresses(%{}) do
    with {:ok, master_wallet} <- get_master_wallet() do
      Api.Accounts.WalletsApi.list_addresses(%{
        wallet_id: master_wallet.wallet_id
      })
    end
  end

  # https://developers.circle.com/reference/createbusinessaccountrecipientaddress
  @route path: "/recipient", method: :post
  def add_recipient_address(%{
        idempotencyKey: idempotency_key,
        address: address,
        chain: chain,
        currency: currency,
        description: description
      }) do
    with :ok <- check_idempotency_key(idempotency_key),
         {:ok, recipient} <- RecipientState.new_recipient(address, chain, currency, description) do
      RecipientState.add_recipient(recipient)
      {:ok, Recipient.serialize(recipient)}
    end
  end

  # https://developers.circle.com/reference/getbusinessaccountrecipientaddresses
  @route "/recipient"
  def list_recipient_addresses(%{}) do
    {:ok, Enum.map(RecipientState.all_recipients(), &Recipient.serialize/1)}
  end
end