Then(/^I should see a Workstation error message using login page$/) do
  error_text = "THE USERNAME AND PASSWORD DON'T MATCH OUR RECORDS."
  on(Workstation::LoginPage) do |page|
    page.wait_until { page.alert_text_element.wait_until(&:present?) }
    expect(page.alert_text).to include error_text
  end
end

Given(/^I log in using the login page to Workstation as the (\S+) user$/) do |user_name|
  user_name = user_name.to_sym
  workstation_user_data = DataHelpers::UserConfig.lookup(:workstation, user_name)
  on(Workstation::LoginPage) do |page|
    @users.record_workstation_user(
      name: user_name,
      user_data: workstation_user_data
    )
    page.login_with(workstation_user_data[:username], workstation_user_data[:password])
    page.wait_until { page.loading_indicator_element.when_not_present }
  end
end

# rubocop:disable Metrics/BlockLength
Given(/^I am an Auth0 non-migrated (\S+) user$/) do |user_name|
  user_name = user_name.to_sym
  workstation_user_data = DataHelpers::UserConfig.lookup(:workstation, user_name)
  @users.record_workstation_user(
    name: user_name,
    user_data: workstation_user_data
  )
  # START log out script
  # log out first if currently logged in
  on(Workstation::BasePage) do |page|
    # get on valid Workstation page
    unless page.current_url.include?(page.page_url_value) && page.valid_login_header?
      page.goto
    end
  end

  unless on(Workstation::LoginPage).login_form?
    next if on(Workstation::BasePage).logged_in_as?(workstation_user_data)
    on(Workstation::BasePage) do |page|
      # logout if we're logged in as the wrong user
      # this is a workaround for a bug with the logout process
      # TODO: see if this is fixed with WSR
      begin
        page.logout
      rescue Selenium::WebDriver::Error::UnknownError # if unclickable
        if page.url.include? "modal"
          visit(Workstation::BasePage)
        else
          page.refresh
        end
        page.logout
      end
    end
    on(Workstation::LoginPage).login_form_element.when_present
  end
  # END log out script
end
# rubocop:enable Metrics/BlockLength

Given(/^I already have an Auth0 migrated user account (\S+)$/) do |user_name|
  user_name = user_name.to_sym
  workstation_user_data = DataHelpers::UserConfig.lookup(:workstation, user_name)
  @users.record_workstation_user(
    name: user_name,
    user_data: workstation_user_data
  )
end

When(/^I enter new creds for the (\S+) user$/) do |user_name|
  user_name = user_name.to_sym
  workstation_user_data = DataHelpers::UserConfig.lookup(:workstation, user_name)
  on(Workstation::LoginPage) do |page|
    page.check_privacy_confirm
    page.privacy_agree
    page.migration_email_element.set(workstation_user_data[:username2])
    page.email_next
    page.wait_until { page.loading_indicator_element.when_not_present }
    page.migration_password_element.set(workstation_user_data[:password2])
    page.password_next
    page.wait_until { page.loading_indicator_element.when_not_present }
  end
end

When(/^I enter the email address of the (\S+) user$/) do |user_name|
  user_name = user_name.to_sym
  workstation_user_data = DataHelpers::UserConfig.lookup(:workstation, user_name)
  on(Workstation::LoginPage) do |page|
    page.check_privacy_confirm
    page.privacy_agree
    page.migration_email_element.set(workstation_user_data[:username2])
    page.email_next
    page.wait_until { page.loading_indicator_element.when_not_present }
  end
end

When(/^I enter a new password for auth0 user$/) do
  on(Workstation::LoginPage) do |page|
    page.reset_password
    # Wait until the redirection url contains 'workstation'
    page.wait_until(60) { @browser.url.include? "workstation" }
  end
end

When(/^I click the (\S+) link from the email$/) do |link_type|
  email_content = Support::S3Client.read_file(
    bucket: "qa-orcdbucket",
    prefix: "auth0/emails/" + @users.workstation_user_data[:username2].split("@").first
  )
  # Lines below extracts the auth0 verification link from email written in s3 bucket file
  # unpack - decode quoted-printable encoding
  if link_type == "verification"
    # We expect the email contents to be "....ACCOUNT avbc <verification_link> something /anotherlink"
    # and we need to get <verification_link>
    links = email_content.partition("ACCOUNT").last.scan(/\(.*?\)/m).first.unpack("M")
    final_link = URI.extract([links.to_s].first).first.to_s
  elsif link_type == "activation"
    # We expect the email contents to be "....Visit this link  <activation_link> something /anotherlink"
    # and we need to get <activation_link>
    final_link = URI.extract(email_content.partition("Visit this lin").last.unpack("M").to_s)[1]
  elsif link_type == "reset"
    # We expect the email contents to be "....CHANGE PASSWORD  <reset_password_link> something /anotherlink"
    final_link = URI.extract(email_content.partition("CHANGE PASSWORD").last.unpack("M").to_s)[1]
  end
  # logs to identify correctness of extracted link
  puts link_type.to_s + "  :  " + final_link.to_s
  @browser.goto final_link
end

# rubocop:disable Metrics/BlockLength
Given(/^I log in using new creds to Workstation as the (\S+) user$/) do |user_name|
  user_name = user_name.to_sym
  workstation_user_data = DataHelpers::UserConfig.lookup(:workstation, user_name)
  @users.record_workstation_user(
    name: user_name,
    user_data: workstation_user_data
  )
  # START log out script
  # log out first if currently logged in
  on(Workstation::BasePage) do |page|
    # get on valid Workstation page
    unless page.current_url.include?(page.page_url_value) && page.valid_login_header?
      page.goto
    end
  end

  unless on(Workstation::LoginPage).login_form?
    next if on(Workstation::BasePage).logged_in_as?(workstation_user_data)
    on(Workstation::BasePage) do |page|
      # logout if we're logged in as the wrong user
      # this is a workaround for a bug with the logout process
      # TODO: see if this is fixed with WSR
      begin
        page.logout
      rescue Selenium::WebDriver::Error::UnknownError # if unclickable
        if page.url.include? "modal"
          visit(Workstation::BasePage)
        else
          page.refresh
        end
        page.logout
      end
    end
    on(Workstation::LoginPage).login_form_element.when_present
  end
  # END log out script

  on(Workstation::LoginPage) do |page|
    page.login_with(workstation_user_data[:username2], workstation_user_data[:password2])
    page.wait_until { page.loading_indicator_element.when_not_present }
  end
end
# rubocop:enable Metrics/BlockLength

When(/^I enter the one time password for the (\S+) authenticator$/) do |mfa|
  on(Workstation::LoginPage) do |page|
    if mfa == "google"
      page.google_migrate
    elsif mfa == "sms"
      page.sms_migrate @users.workstation_user_data[:sms_number]
    elsif mfa == "sms_login"
      page.wait_until(20) do
        page.auth0_error_alert_element.element.present? ||
          page.auth0_success_alert_element.element.present?
      end
      if page.auth0_error_alert_element.element.exist?
        skip_this_scenario
      else
        page.sms_login @users.workstation_user_data[:sms_number]
      end
    elsif mfa == "guardian"
      page.guardian_login @users.workstation_user_data[:secret]
    elsif mfa == "google_login"
      page.google_login @users.workstation_user_data[:secret]
    end
    # Wait until the redirection url contains 'workstation'
    page.wait_until(60) { @browser.url.include? "workstation" }
  end
end

When(/^I attempt to log in using the login page to Workstation with invalid credentials$/) do
  workstation_user_data = DataHelpers::UserConfig.lookup(:workstation, :invalid)
  on(Workstation::LoginPage).login_with(
    workstation_user_data[:username], workstation_user_data[:password]
  )
end

When(/^I log in using new creds to Workstation as the (\S+) user using (\S+) MFA$/) do |user_name, mfa|
  step "I log in using new creds to Workstation as the #{user_name} user"
  step "I enter the one time password for the #{mfa} authenticator"
end

Then(/^I see a message about Activating Single Sign On$/) do
  on(Workstation::LoginPage) do |page|
    expect(page.activation_confirm_element.present?).to be true
  end
end

Then(/^I see a message about Change Your Password$/) do
  on(Workstation::LoginPage) do |page|
    expect(page.reset_confirm_element.text).to eq "Change Your Password"
  end
end

Then(/^I can see linked (\S+) account in header$/) do |user_name|
  user_name = user_name.to_sym
  workstation_user_data = DataHelpers::UserConfig.lookup(:workstation, user_name)
  on(ReactWorkstation::ReactHomePage) do |page|
    page.label_name_dropdown_react_element.click
    page.header_right_element.link_elements do |element|
      expect(element.text).contains workstation_user_data[:vendor_name]
      expect(element.text).contains workstation_user_data[:id].to_s
    end
    page.refresh
  end
end
