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
  return unless config.lookbook.listen == true
  Listen.logger = Lookbook.logger
  Lookbook.logger.info "Initializing listeners"
  preview_listener = Listen.to(
    *config.lookbook.listen_paths,
    only: /\.(#{config.lookbook.listen_extensions.join("|")})$/,
    force_polling: config.lookbook.listen_use_polling
  ) do |modified, added, removed|
    changes = {modified: modified, added: added, removed: removed}
    begin
      Lookbook::Engine.parser.parse
    rescue
    end
    Lookbook::Preview.clear_cache
    Lookbook::Engine.reload_ui(changes)
    Lookbook::Engine.run_hooks(:after_change, changes)
  end
  Lookbook::Engine.register_listener(preview_listener)
  page_listener = Listen.to(
    *config.lookbook.page_paths,
    only: /\.(html.*|md.*)$/,
    force_polling: config.lookbook.listen_use_polling
  ) do |modified, added, removed|
    changes = {modified: modified, added: added, removed: removed}
    Lookbook::Engine.reload_ui(changes)
    Lookbook::Engine.run_hooks(:after_change, changes)
  end
  Lookbook::Engine.register_listener(page_listener)
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, config.lookbook.parser_registry_path)
end

def register_listener(listener)

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

def reload_ui(changed = {})

def reload_ui(changed = {})
  websocket&.broadcast("reload", changed)
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 websocket

def websocket
  return @websocket unless @websocket.nil?
  if config.lookbook.auto_refresh
    cable = ActionCable::Server::Configuration.new
    cable.cable = {adapter: "async"}.with_indifferent_access
    cable.mount_path = config.lookbook.cable_mount_path
    cable.connection_class = -> { Lookbook::Connection }
    cable.logger = config.lookbook.cable_logger
    @websocket ||= if Rails.version.to_f >= 6.0
      ActionCable::Server::Base.new(config: cable)
    else
      ws = ActionCable::Server::Base.new
      ws.config = cable
      ws
    end
  end
end

def websocket_mount_path

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