module Legitbot

def self.bot(user_agent, ip)

rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity

:yields: a found bot
otherwise.
Returns +nil+ if no bot found and a bot match instance

If a block given, passes the found bot to the block.

Lookup a bot based on its signature from +User-Agent+ header.
#
def self.bot(user_agent, ip)
  bots = @rules
         .select { |rule| rule[:fragments].any? { |f| user_agent.index f } }
         .map { |rule| rule[:class].new(ip) }
  selected = bots.select(&:valid?).first if bots.size > 1
  selected = bots.last if selected.nil?
  if selected && block_given?
    yield selected
  else
    selected
  end
end

def self.rule(clazz, fragments)

def self.rule(clazz, fragments)
  @rules << { class: clazz, fragments: fragments }
end