class RuboCop::Cop::Betterment::UnscopedFind

def find_param_arg(arg_nodes)

def find_param_arg(arg_nodes)
  return unless arg_nodes
  arg_nodes.find do |arg|
    if arg.hash_type?
      arg.children.each do |pair|
        _key, value = *pair.children
        return arg if uses_params?(value)
      end
    end
    uses_params?(arg)
  end
end

def graphql_file?

def graphql_file?
  processed_source.path&.match?(GRAPHQL_PATTERN)
end

def graphql_namespace?(node)

def graphql_namespace?(node)
  node
    .each_ancestor(:class, :module)
    .any? { |ancestor| find_graphql_namespace_nodes(ancestor).any? }
end

def initialize(config = nil, options = nil)

def initialize(config = nil, options = nil)
  super
  @unauthenticated_models = cop_config.fetch("unauthenticated_models").map(&:to_sym)
end

def on_class(node)

def on_class(node)
  Utils::MethodReturnTable.populate_index(node)
end

def on_send(node)

def on_send(node)
  _, _, *arg_nodes = *node # rubocop:disable InternalAffairs/NodeDestructuring
  return unless
    (
      find?(node) ||
      custom_scope_find?(node) ||
      static_method_name(node.method_name)
    ) && !@unauthenticated_models.include?(Utils::Parser.get_root_token(node))
  add_offense(node) if find_param_arg(arg_nodes) || graphql_file? || graphql_namespace?(node)
end

def static_method_name(method_name)

yoinked from Rails/DynamicFindBy
def static_method_name(method_name)
  match = METHOD_PATTERN.match(method_name)
  return nil unless match
  match[2] ? 'find_by!' : 'find_by'
end

def uses_params?(node)

def uses_params?(node)
  root = Utils::Parser.get_root_token(node)
  root == :params || Array(Utils::MethodReturnTable.get_method(root)).find do |x|
    Utils::Parser.get_root_token(x) == :params
  end
end