Given(/^I am OA unauthenticated$/) do
  visit(OA::BasePage) do |page|
    page.logout_link if page.logout_link?
  end
  on(OA::LoginPage).login_form_element.when_present
end

Given(/^I am not whitelisted for two-factor authentication$/) do
  if MISC_SETTINGS[:tfa_whitelisted]
    fail "TFA is whitelisted for this CUCUMBER_PROFILE! Use a different one."
  end
end

When(/^I log in to OA$/) do
  oa_user_data = DataHelpers::UserConfig.lookup(:oa, :technology_manager)
  on(OA::LoginPage).login_with_user_data(oa_user_data)
  @users.record_oa_user(
    name: :technology_manager,
    user_data: oa_user_data
  )
end

Then(/^I should be on the OA verification page$/) do
  on(OA::NeedVerificationPage).expect_to_be_on_page
end

When(/^I follow the sent verification link$/) do
  link = Support::Helpers::TwoFactorLogin.new(@users.oa_user_data).link_from_most_recent_email
  @browser.goto link
end

When(/^I navigate to an? (expired|used) verification URL$/) do |token_status|
  oa_user_data = DataHelpers::UserConfig.lookup(:oa, :technology_manager)
  login_helper = Support::Helpers::TwoFactorLogin.new(oa_user_data)

  secret = case token_status
           when "expired"
             login_helper.expired_secret
           when "used"
             unless login_helper.secret_exists?(status: :used)
               login_to_oa_with_valid_token(oa_user_data)
               on(OA::BasePage).logout_link
             end
             login_helper.used_secret
           else
             fail "unknown token_status!"
           end

  visit(
    OA::VerifyPage,
    using_params: {
      queries: {
        secret: secret,
        login: oa_user_data[:username]
      }
    }
  )
end

Then(/^I should see an error that the verification link has expired$/) do
  on(OA::LoginPage) do |page|
    expect(page.message_text).to include "Sorry, your verification link has expired."
  end
end

Then(/^I should be logged in to OA$/) do
  on(OA::RelationshipsPage) do |page|
    page.expect_to_be_on_page
    expect(page.user_full_name).to eql @users.oa_user_data[:vendor_name]
  end
end

When(/^I log out of OA$/) do
  on(OA::BasePage).logout_link
end

Then(/^I should be logged out of OA$/) do
  on(OA::LoginPage) do |page|
    expect(page.login_form?).to be true
  end
end

When(/^I attempt to log in to OA with invalid credentials$/) do
  user = DataHelpers::UserConfig.lookup(:oa, :invalid)
  on(OA::LoginPage).login_with_user_data(user)
end

Then(/^I should see an OA error message$/) do
  error_text = "Sorry, invalid login information provided"
  on(OA::LoginPage) do |page|
    expect(page.message_text).to include error_text
  end
end
