defmodule Circlex.Emulator.State.PayoutState do
alias Circlex.Emulator.State
alias Circlex.Struct.{Amount, Payout, SourceDest}
alias Circlex.Emulator.Logic.PayoutLogic
import State.Util
def all_payouts(filters \\ []) do
get_payouts_st(fn payouts -> payouts end, filters)
end
def get_payout(id, filters \\ []) do
get_payouts_st(fn payouts -> PayoutLogic.get_payout(payouts, id) end, filters)
end
def add_payout(payout) do
update_payouts_st(fn payouts -> PayoutLogic.add_payout(payouts, payout) end)
end
def update_payout(payout_id, f) do
update_payouts_st(fn payouts -> PayoutLogic.update_payout(payouts, payout_id, f) end)
end
def new_payout(source, destination, amount, currency, _metadata) do
{:ok,
%Payout{
id: State.next(:uuid),
source_wallet_id: fetch(source, :id),
destination: SourceDest.deserialize(destination),
amount: %Amount{
amount: amount,
currency: currency
},
fees: %Amount{
amount: "0.00",
currency: "USD"
},
status: "pending",
tracking_ref: State.next(:tracking_ref),
create_date: State.next(:date),
update_date: State.next(:date)
}}
end
def deserialize(st) do
%{st | payouts: Enum.map(st.payouts, &Payout.deserialize/1)}
end
def serialize(st) do
%{st | payouts: Enum.map(st.payouts, &Payout.serialize/1)}
end
def initial_state() do
%{payouts: []}
end
defp get_payouts_st(mfa_or_fn, filters) do
State.get_st(mfa_or_fn, [:payouts], &apply_filters(&1, filters))
end
defp update_payouts_st(mfa_or_fn, filters \\ []) do
State.update_st(mfa_or_fn, [:payouts], &apply_filters(&1, filters))
end
end