require 'selenium-webdriver'
require 'faker'

class WebMonkey
  attr_accessor :driver
  attr_accessor :wait
  DEFAULT_WAIT_TIMEOUT = 0.5

  def initialize(driver:)
    self.driver = driver
    self.wait = Selenium::WebDriver::Wait.new(timeout: DEFAULT_WAIT_TIMEOUT)
  end

  # Helpers
  def execute_kraken_monkey(number_of_events)
    number_of_events.times do |_i|
      execute_random_action
    end
  end

  def execute_random_action
    arr = [
      method(:random_click), method(:insert_random_text)
    ]
    arr.sample.call
  rescue StandardError => _e
    nil
  end

  def random_click
    element = @wait.until { driver.find_elements(:xpath, '//*').sample }
    highlight_element(element)
    element.click
    remove_element_highlight(element)
  end

  def insert_random_text
    element = @wait.until { driver.find_elements(:xpath, '//input').sample }
    highlight_element(element)
    element.click
    text = [Faker::Lorem.word, Faker::Lorem.sentence].sample
    element.send_keys(text)
    remove_element_highlight(element)
  end

  private

  def highlight_element(element)
    @driver.execute_script(
      "arguments[0].setAttribute('style', arguments[1]);",
      element,
      'color: red; border: 2px solid red'
    )
  end

  def remove_element_highlight(element)
    @driver.execute_script(
      "arguments[0].setAttribute('style', arguments[1]);",
      element,
      ''
    )
  end
end