# frozen_string_literal: true

module AnyCable
  module BroadcastAdapters # :nodoc:
    module_function

    # rubocop: disable Metrics/AbcSize, Metrics/MethodLength
    def lookup_adapter(args)
      adapter, options = Array(args)
      path_to_adapter = "anycable/broadcast_adapters/#{adapter}"
      adapter_class_name = adapter.to_s.split("_").map(&:capitalize).join

      unless BroadcastAdapters.const_defined?(adapter_class_name, false)
        begin
          require path_to_adapter
        rescue LoadError => e
          # We couldn't require the adapter itself.
          if e.path == path_to_adapter
            raise e.class, "Couldn't load the '#{adapter}' broadcast adapter for AnyCable",
                  e.backtrace
          # Bubbled up from the adapter require.
          else
            raise e.class, "Error loading the '#{adapter}' broadcast adapter for AnyCable",
                  e.backtrace
          end
        end
      end

      BroadcastAdapters.const_get(adapter_class_name, false).new(options || {})
    end
    # rubocop: enable Metrics/AbcSize, Metrics/MethodLength
  end
end