lib/circlex/emulator/state/subscription_state.ex

defmodule Circlex.Emulator.State.SubscriptionState do
  require Logger

  import Circlex.Emulator.State.Util

  alias Circlex.Emulator.State
  alias Circlex.Struct.Subscription
  alias Circlex.Emulator.Logic.SubscriptionLogic

  def all_subscriptions(filters \\ []) do
    get_subscriptions_st(fn subscriptions -> subscriptions end, filters)
  end

  def get_subscription(id, filters \\ []) do
    get_subscriptions_st(
      fn subscriptions -> SubscriptionLogic.get_subscription(subscriptions, id) end,
      filters
    )
  end

  def add_subscription(subscription) do
    update_subscriptions_st(fn subscriptions ->
      SubscriptionLogic.add_subscription(subscriptions, subscription)
    end)
  end

  def update_subscription(subscription_id, f) do
    update_subscriptions_st(fn subscriptions ->
      SubscriptionLogic.update_subscription(subscriptions, subscription_id, f)
    end)
  end

  def remove_subscription(subscription_id) do
    update_subscriptions_st(fn subscriptions ->
      SubscriptionLogic.remove_subscription(subscriptions, subscription_id)
    end)
  end

  def deserialize(st) do
    %{st | subscriptions: Enum.map(st.subscriptions, &Subscription.deserialize/1)}
  end

  def serialize(st) do
    %{st | subscriptions: Enum.map(st.subscriptions, &Subscription.serialize/1)}
  end

  def initial_state() do
    %{subscriptions: []}
  end

  def new_subscription(endpoint) do
    {:ok,
     %Subscription{
       id: State.next(:uuid),
       endpoint: endpoint,
       subscription_details: []
     }}
  end

  defp get_subscriptions_st(mfa_or_fn, filters) do
    State.get_st(mfa_or_fn, [:subscriptions], &apply_filters(&1, filters))
  end

  defp update_subscriptions_st(mfa_or_fn, filters \\ []) do
    State.update_st(mfa_or_fn, [:subscriptions], &apply_filters(&1, filters))
  end
end