module Avo::Concerns::FiltersSessionHandler

def cache_resource_filters?

def cache_resource_filters?
  Avo::ExecutionContext.new(
    target: Avo.configuration.cache_resource_filters,
    current_user: current_user,
    resource: @resource
  ).handle
end

def fetch_filters

def fetch_filters
  return filters_from_params unless cache_resource_filters?
  (filters_from_params && save_filters_to_session) || filters_from_session
end

def filters_from_params

def filters_from_params
  params[Avo::Filters::BaseFilter::PARAM_KEY].presence
end

def filters_from_session

def filters_from_session
  session[filters_session_key]
end

def filters_session_key

def filters_session_key
  @filters_session_key ||= '/filters/' << %w[
    turbo_frame controller resource_name related_name
    action id
  ].map { |key| params[key] }.compact.join('/')
end

def reset_filters

def reset_filters
  return unless cache_resource_filters?
  session.delete(filters_session_key)
end

def save_filters_to_session

def save_filters_to_session
  session[filters_session_key] = params[Avo::Filters::BaseFilter::PARAM_KEY]
end