lib/tai/advisors/queries/search_configs.ex

defmodule Tai.Advisors.Queries.SearchConfigs do
  @type store_id_opt :: {:store_id, atom}
  @type where_opt :: {:where, list}
  @type order_opt :: {:order, list}
  @type opt :: store_id_opt | where_opt | order_opt
  @type result :: [Tai.Fleets.AdvisorConfig.t()]

  @default_filters []
  @default_order [:fleet_id, :advisor_id]
  @default_store_id Tai.Fleets.AdvisorConfigStore.default_store_id()

  @spec call([opt]) :: result
  def call(options) do
    store_id = Keyword.get(options, :store_id, @default_store_id)
    filters = Keyword.get(options, :where, @default_filters)
    order_by = Keyword.get(options, :order, @default_order)

    store_id
    |> Tai.Fleets.AdvisorConfigStore.all()
    |> Enumerati.filter(filters)
    |> Enumerati.order(order_by)
  end
end