# rubocop:disable Style/FileName
# require 'reactrb/auto-import' to automatically
# import JS libraries and components when they are detected
if RUBY_ENGINE == 'opal'
  # modifies const and method_missing so that they will attempt
  # to auto import native libraries and components using Hyperstack::Component::NativeLibrary
  class Object
    class << self
      alias _reactrb_original_const_missing const_missing
      alias _reactrb_original_method_missing method_missing

      def const_missing(const_name)
        # Opal uses const_missing to initially define things,
        # so we always call the original, and respond to the exception
        _reactrb_original_const_missing(const_name)
      rescue StandardError => e
        Hyperstack::Internal::Component::NativeLibrary.import_const_from_native(Object, const_name, true) || raise(e)
      end

      def _reactrb_import_component_class(method)
        Hyperstack::Internal::Component::NativeLibrary.import_const_from_native(self, method, false)
      end

      def method_missing(method, *args, &block)
        component_class = _reactrb_import_component_class(method)
        _reactrb_original_method_missing(method, *args, &block) unless component_class
        Hyperstack::Internal::Component::RenderingContext.render(component_class, *args, &block)
      end
    end
  end

  # The public NativeLibrary can't be used directly to
  # import_const_from_native, because it is set to import from
  # `window.NativeLibrary`.  So we set up an internal class that won't
  #  have any prefix defined.
  module Hyperstack
    module Internal
      module Component
        class NativeLibrary < Hyperstack::Component::NativeLibrary
        end
      end
    end
  end
end
