# populates fields and crap
class Wtffuct
  require 'addressable'
  require 'bundler'
  require 'byebug'
  require 'watir-webdriver'

  def self.login(url)
    unless @browser.h5(id: 'logged_in_user').exist?
      @browser.goto 'oa.qaorch.com'
      if File.exist?(Dir.pwd + '/../config/users.yml') # && !page.login_error?
        puts 'Attempting to log in using YML file.'
        oa_login = YAML.load_file(Dir.pwd + '/../config/users.yml')
        @browser.text_field(name: 'username').set oa_login['username']
        @browser.text_field(name: 'password').set oa_login['password']
        @browser.button(id: 'sign_in').click
        @browser.h5(id: 'logged_in_user').wait_until_present
        @browser.goto url
      end
    end
  end

  def self.check_for_browser_alert
    if @browser.alert.present?
      close_alert
      @crap_url = @browser.url
      puts "Getting JS alert on: #{@crap_url}"
      puts "The form was submitted from #{@url_with_form} containing:\n#{@form_text}"
    end
  end

  def self.close_alert
    @browser.alert.ok
    sleep 1
    if @browser.alert.present?
      close_alert
    end
  end

  def self.fill_in_forms
    page_forms = @browser.forms.size
    i = 0
    loop do
      current_form = @browser.forms[i]
      Watir::Wait.until { current_form.present? }
      if current_form.text_fields.any?
        current_form.text_fields.each do |current_text_field|
          if current_text_field.attribute_value('readonly') != 'true' && current_text_field.visible? && ( current_text_field.max_length == nil || current_text_field.max_length >= 25 )
            current_text_field.set '<script>alert(1)</script>'
          end
        end
        submit_button = current_form.buttons.find { |x| x.outer_html.include? 'submit'}
        if submit_button.visible?
          @url_with_form = @browser.url
          @form_text = current_form.text
          submit_button.click
          sleep 3
          # Watir::Wait.until { @browser.url != @url_with_form || !current_form.present? || @browser.div(class: 'alertError').present? }
        end
        check_for_browser_alert
        if @browser.url == @url_with_form
          puts "URL didn't change after submitting form on #{@url_with_form}. Check it out!"
          if @browser.url.include? "edit"
            @browser.goto @browser.url.sub('edit','view')
            check_for_browser_alert
          end
        end
        @browser.goto @url_with_form
      end
      i += 1
      break unless i < page_forms
    end
  end

  def self.enable_via_cookie(feature)
    return if feature_enabled? feature
    set_cookie(feature, "enabled")
  end

  def self.feature_enabled?(feature)
    # byebug
    cookies = @browser.cookies.to_a
    cookie = cookies.find { |x| x[:name] == "features[#{feature}]"}
    if cookie
      return true if cookie[:value] == "enabled"
    else
      return false
    end
  end

  def self.set_cookie(feature, variant, cookie = "1")
    uri = Addressable::URI.parse(@browser.url)
    # Use Array of [key, value] pairs in order to
    # preserve param order: http://stackoverflow.com/a/24695485/3456726
    initial_query = uri.query_values ? uri.query_values.to_a : []
    uri.query_values = initial_query + [
        ["feature", feature],
        ["feature_variant", variant],
        ["feature_cookie", cookie]
    ]
    @browser.goto(uri.to_s)
    check_for_fatal_error
  end

  def self.check_for_fatal_error
    fail "Could not set feature control cookie!\n #{@browser.text}" if @browser.b(text: /^fatal error$/i).present?
  end

  @browser = Watir::Browser.new :firefox
  File.open(Dir.pwd + '/../config/url_list.txt') do |f|
    f.each_line do |line|
      @browser.goto line
      enable_via_cookie("psyduck")
      login(line)
      fill_in_forms
    end
  end
  puts 'Done.'
end
