module Avo

def self.asset_manager

def self.asset_manager
  @manager ||= AssetManager.new
end

def self.configuration

def self.configuration
  @configuration ||= Configuration.new
end

def self.configuration=(config)

def self.configuration=(config)
  @configuration = config
end

def self.configure

def self.configure
  yield configuration
end

def self.plugin_manager

def self.plugin_manager
  @plugin_manager ||= PluginManager.new
end

def app_status

def app_status
  license.valid?
end

def avo_dynamic_filters_installed?

def avo_dynamic_filters_installed?
  defined?(Avo::DynamicFilters).present?
end

def boot

Runs when the app boots up
def boot
  @logger = Avo.configuration.logger
  @field_manager = Avo::Fields::FieldManager.build
  @cache_store = Avo.configuration.cache_store
  plugin_manager.boot_plugins
  Avo.run_load_hooks(:boot, self)
  eager_load_actions
end

def eager_load_actions

def eager_load_actions
  Rails.autoloaders.main.eager_load_namespace(Avo::Actions) if defined?(Avo::Actions)
end

def extra_gems

def extra_gems
  [:pro, :advanced, :menu, :dynamic_filters, :dashboards, :enterprise, :audits]
end

def has_main_menu?

def has_main_menu?
  return false if Avo.license.lacks_with_trial(:menu_editor)
  return false if Avo.configuration.main_menu.nil?
  true
end

def has_profile_menu?

def has_profile_menu?
  return false if Avo.license.lacks_with_trial(:menu_editor)
  return false if Avo.configuration.profile_menu.nil?
  true
end

def init

Runs on each request
def init
  Avo::Current.error_manager = Avo::ErrorManager.build
  Avo::Current.resource_manager = Avo::Resources::ResourceManager.build
  Avo::Current.tool_manager = Avo::Tools::ToolManager.build
  Avo.run_load_hooks(:init, self)
end

def main_menu

def main_menu
  return unless Avo.plugin_manager.installed?("avo-menu")
  # Return empty menu if the app doesn't have the profile menu configured
  return Avo::Menu::Builder.new.build unless has_main_menu?
  Avo::Menu::Builder.parse_menu(&Avo.configuration.main_menu)
end

def mount_engines

Mount all Avo engines
def mount_engines
  -> {
    mount Avo::DynamicFilters::Engine, at: "/avo-dynamic_filters" if defined?(Avo::DynamicFilters::Engine)
    mount Avo::Dashboards::Engine, at: "/dashboards" if defined?(Avo::Dashboards::Engine)
    mount Avo::Pro::Engine, at: "/avo-pro" if defined?(Avo::Pro::Engine)
  }
end

def mount_path

def mount_path
  Avo::Engine.routes.find_script_name({})
end

def profile_menu

def profile_menu
  return unless Avo.plugin_manager.installed?("avo-menu")
  # Return empty menu if the app doesn't have the profile menu configured
  return Avo::Menu::Builder.new.build unless has_profile_menu?
  Avo::Menu::Builder.parse_menu(&Avo.configuration.profile_menu)
end

def root_path(paths: [], query: {}, **args)

Generate a dynamic root path using the URIService
def root_path(paths: [], query: {}, **args)
  Avo::Services::URIService.parse(Avo::Current.view_context.avo.root_url.to_s)
    .append_paths(paths)
    .append_query(query)
    .to_s
end