class Lookbook::Engine

def app_name

def app_name
  name = if Gem::Version.new(Rails.version) >= Gem::Version.new("6.1")
    Rails.application.class.module_parent_name
  else
    Rails.application.class.parent_name
  end
  name.underscore
end

def init_listeners

def init_listeners
  config = Lookbook.config
  return unless config.listen == true
  Listen.logger = Lookbook.logger
  listen_paths = config.listen_paths.uniq
  if listen_paths.any?
    preview_listener = Listen.to(*listen_paths,
      only: /\.(#{config.listen_extensions.join("|")})$/,
      force_polling: config.listen_use_polling) do |modified, added, removed|
      parser.parse do
        run_hooks(:after_change, {modified: modified, added: added, removed: removed})
      end
    end
    register_listener(preview_listener)
  end
  page_paths = config.page_paths.uniq
  if page_paths.any?
    page_listener = Listen.to(*page_paths,
      only: /\.(html.*|md.*)$/,
      force_polling: config.listen_use_polling) do |modified, added, removed|
      changes = {modified: modified, added: added, removed: removed}
      reload_ui
      run_hooks(:after_change, changes)
    end
    register_listener(page_listener)
  end
end

def listeners

def listeners
  @listeners ||= []
end

def log_level

def log_level
  Lookbook.logger.level
end

def mounted_path

def mounted_path
  Lookbook::Engine.routes.find_script_name({})
end

def parser

def parser
  @parser ||= Lookbook::Parser.new(config.lookbook.preview_paths)
end

def prevent_listening?

def prevent_listening?
  Rails.env.test? || running_in_rake_task?
end

def register_listener(listener)

def register_listener(listener)
  listener.start
  listeners << listener
end

def reload_ui

def reload_ui
  websocket&.broadcast("reload", {})
end

def run_hooks(event_name, *args)

def run_hooks(event_name, *args)
  config.lookbook.hooks[event_name].each do |hook|
    hook.call(Lookbook, *args)
  end
end

def running_in_rake_task?

def running_in_rake_task?
  if defined?(Rake) && Rake.respond_to?(:application)
    File.basename($0) == "rake" || Rake.application.top_level_tasks.any?
  else
    false
  end
end

def stop_listeners

def stop_listeners
  listeners.each { |listener| listener.stop }
end

def websocket

def websocket
  config = Lookbook.config
  return @websocket unless @websocket.nil?
  return unless config.auto_refresh == true && config.listen == true && !Rails.env.test?
  Lookbook.logger.info "Initializing websocket"
  cable = ActionCable::Server::Configuration.new
  cable.cable = {adapter: "async"}.with_indifferent_access
  cable.mount_path = nil
  cable.connection_class = -> { Lookbook::Connection }
  cable.logger = config.cable_logger
  @websocket ||= if Gem::Version.new(Rails.version) >= Gem::Version.new(6.0)
    ActionCable::Server::Base.new(config: cable)
  else
    ws = ActionCable::Server::Base.new
    ws.config = cable
    ws
  end
end

def websocket?

def websocket?
  websocket.present?
end

def websocket_mount_path

def websocket_mount_path
  "#{mounted_path}#{config.lookbook.cable_mount_path}" if websocket?
end