module Filtering

def allowed_search_columns(names)

def allowed_search_columns(names)
  class_variable_set(:@@allowed_search_columns, names)
end

def allowed_sort_columns(names)

def allowed_sort_columns(names)
  class_variable_set(:@@allowed_sort_columns, names)
end

def filter(relation)

def filter(relation)
  params = query_params
  allowed_search_columns = self.class.class_variable_get(:@@allowed_search_columns)
  if params[:search].present? && params[:search_on].present? && allowed_search_columns.include?(params[:search_on])
    relation = relation.where("lower(#{params[:search_on]}) LIKE ?", "%#{params[:search].downcase}%")
  end
  allowed_sort_columns = self.class.class_variable_get(:@@allowed_sort_columns)
  if params[:sort_on].present? && allowed_sort_columns.include?(params[:sort_on])
    sort_col = params[:sort_on]
    sort_dir = params[:sort_direction]
    sort_dir = "asc" if sort_dir == "ascending"
    sort_dir = "desc" if sort_dir == "descending"
    relation = relation.order({sort_col => sort_dir})
  end
  relation = relation.paginate(page: params[:page], per_page: params[:per_page])
  meta = {
    current_page: relation.current_page,
    next_page: relation.next_page,
    prev_page: relation.previous_page,
    total_pages: relation.total_pages,
    total_items: relation.total_entries,
  }
  [relation, meta]
end

def query_params

def query_params
  params.
    permit(:search, :sort_on, :sort_direction, :page, :per_page, :search_on).
    with_defaults(sort_direction: "asc", page: 1, per_page: 30)
end