module Avo::Concerns::FetchesThings

def dashboards_for_navigation(user = nil)

def dashboards_for_navigation(user = nil)
  return [] if App.license.lacks_with_trial(:resource_ordering)
  get_available_dashboards(user).select do |dashboard|
    dashboard.is_visible?
  end
end

def get_available_dashboards(user = nil)

def get_available_dashboards(user = nil)
  dashboards.sort_by { |r| r.name }
end

def get_available_resources(user = nil)

def get_available_resources(user = nil)
  valid_resources
    .select do |resource|
      Services::AuthorizationService.authorize user, resource.model_class, Avo.configuration.authorization_methods.stringify_keys["index"], raise_exception: false
    end
    .sort_by { |r| r.name }
end

def get_dashboard_by_id(id)

get_dashboard_by_id(:dashy) -> Dashy

Returns the Avo dashboard by id
def get_dashboard_by_id(id)
  dashboards.find do |dashboard|
    dashboard.id == id
  end
end

def get_dashboard_by_name(name)

get_dashboard_by_name(:dashy) -> Dashy

Returns the Avo dashboard by name
def get_dashboard_by_name(name)
  dashboards.find do |dashboard|
    dashboard.name == name
  end
end

def get_mapping_for_model(klass)

def get_mapping_for_model(klass)
  (Avo.configuration.model_resource_mapping || {}).stringify_keys.transform_values(&:to_s)[klass.to_s]
end

def get_model_class_by_name(name)

get_model_class_by_name('user') => User

Returns the Rails model class by singular snake_cased name
def get_model_class_by_name(name)
  name.to_s.camelize.singularize
end

def get_resource(resource)

get_resource_by_name('User') => UserResource

Returns the Avo resource by camelized name
def get_resource(resource)
  possible_resource = "#{resource}Resource".gsub "ResourceResource", "Resource"
  resources.find do |available_resource|
    possible_resource.to_s == available_resource.class.to_s
  end
end

def get_resource_by_controller_name(name)

get_resource_by_controller_name('users') => UserResource
get_resource_by_controller_name('delayed_backend_active_record_jobs') => DelayedJobResource

Returns the Avo resource by singular snake_cased name
def get_resource_by_controller_name(name)
  valid_resources
    .find do |resource|
      resource.model_class.to_s.pluralize.underscore.tr("/", "_") == name.to_s
    end
end

def get_resource_by_model_name(klass)

def get_resource_by_model_name(klass)
  # Fetch the mappings imposed by the user.
  # If they are present, use those ones.
  mapping = get_mapping_for_model klass
  return get_resource(mapping) if mapping.present?
  valid_resources
    .find do |resource|
      resource.model_class.model_name.name == klass.to_s
    end
end

def get_resource_by_name(name)

get_resource_by_name('user') => UserResource

Returns the Avo resource by singular snake_cased name
def get_resource_by_name(name)
  get_resource name.singularize.camelize
end

def get_sidebar_partials

Insert any partials that we find in app/views/avo/sidebar/items.
def get_sidebar_partials
  Dir.glob(Rails.root.join("app", "views", "avo", "sidebar", "items", "*.html.erb"))
    .map do |path|
      File.basename path
    end
    .map do |filename|
      # remove the leading underscore (_)
      filename[0] = ""
      # remove the extension
      filename.gsub!(".html.erb", "")
      filename
    end
end

def guess_resource(name)

Returns the Avo resource by some name
def guess_resource(name)
  get_resource_by_name(name.to_s) || get_resource_by_model_name(name)
end

def resources_for_navigation(user = nil)

def resources_for_navigation(user = nil)
  get_available_resources(current_user)
    .select do |resource|
      resource.visible_on_sidebar
    end
end

def tools_for_navigation

def tools_for_navigation
  return [] if Avo::App.license.lacks_with_trial(:custom_tools)
  get_sidebar_partials
end

def valid_resources

Filters out the resources that are missing the model_class
def valid_resources
  resources.select do |resource|
    resource.model_class.present?
  end
end