require 'rails_helper'

feature 'Verify Letter' do

  scenario 'Request a letter' do
    user = create(:user, residence_verified_at: Time.now,
                         confirmed_phone:       "611111111")

    login_as(user)
    visit new_letter_path

    click_link "Send me a letter with the code"

    expect(page).to have_content "Thank you for requesting your maximum security code (only required for the final votes). In a few days we will send it to the address featuring in the data we have on file."

    user.reload

    expect(user.letter_requested_at).to be
    expect(user.letter_verification_code).to be
  end

  scenario 'Go to office instead of send letter' do
    user = create(:user, residence_verified_at: Time.now,
                         confirmed_phone:       "611111111")

    login_as(user)
    visit new_letter_path

    expect(page).to have_link "Citizen Support Offices", href: "http://www.madrid.es/portales/munimadrid/es/Inicio/El-Ayuntamiento/Atencion-al-ciudadano/Oficinas-de-Atencion-al-Ciudadano?vgnextfmt=default&vgnextchannel=5b99cde2e09a4310VgnVCM1000000b205a0aRCRD"
  end

  scenario "Deny access unless verified residence" do
    user = create(:user)

    login_as(user)
    visit new_letter_path

    expect(page).to have_content 'You have not yet confirmed your residency'
    expect(current_path).to eq(new_residence_path)
  end

  scenario "Deny access unless verified phone/email" do
    user = create(:user, residence_verified_at: Time.now)

    login_as(user)
    visit new_letter_path

    expect(page).to have_content 'You have not yet entered the confirmation code'
    expect(current_path).to eq(new_sms_path)
  end

  context "Code verification" do

    scenario "Valid verification user logged in" do
      user = create(:user, residence_verified_at: Time.now,
                           confirmed_phone:       "611111111",
                           letter_verification_code: "123456")

      login_as(user)
      visit edit_letter_path

      fill_in "verification_letter_email", with: user.email
      fill_in "verification_letter_password", with: user.password
      fill_in "verification_letter_verification_code", with: user.letter_verification_code
      click_button "Verify my account"

      expect(page).to have_content "Code correct. Your account is now verified"
      expect(current_path).to eq(account_path)
    end

    scenario "Valid verification of user failing to add trailing zeros" do
      user = create(:user, residence_verified_at: Time.now,
                           confirmed_phone:       "611111111",
                           letter_verification_code: "012345")

      login_as(user)
      visit edit_letter_path

      fill_in "verification_letter_email", with: user.email
      fill_in "verification_letter_password", with: user.password
      fill_in "verification_letter_verification_code", with: "12345"
      click_button "Verify my account"

      expect(page).to have_content "Account verified"
      expect(current_path).to eq(account_path)
    end

    scenario "Valid verification user not logged in" do
      user = create(:user, residence_verified_at: Time.now,
                           confirmed_phone:       "611111111",
                           letter_verification_code: "123456")

      visit edit_letter_path

      fill_in "verification_letter_email", with: user.email
      fill_in "verification_letter_password", with: user.password
      fill_in "verification_letter_verification_code", with: user.letter_verification_code
      click_button "Verify my account"

      expect(page).to have_content "Code correct. Your account is now verified"
      expect(current_path).to eq(account_path)
    end

    scenario "Error messages on authentication" do
      visit edit_letter_path

      click_button "Verify my account"

      expect(page).to have_content "Invalid email or password."
    end

    scenario "Error messages on verification" do
      user = create(:user, residence_verified_at: Time.now,
                           confirmed_phone:       "611111111")

      visit edit_letter_path
      fill_in "verification_letter_email", with: user.email
      fill_in "verification_letter_password", with: user.password
      click_button "Verify my account"

      expect(page).to have_content "can't be blank"
    end

    scenario '6 tries allowed' do
      user = create(:user, residence_verified_at:    Time.now,
                           confirmed_phone:          "611111111",
                           letter_verification_code: "123456")

      visit edit_letter_path

      6.times do
        fill_in "verification_letter_email", with: user.email
        fill_in "verification_letter_password", with: user.password
        fill_in "verification_letter_verification_code", with: "1"
        click_button "Verify my account"
      end

      expect(page).to have_content "You have reached the maximum number of attempts. Please try again later."
      expect(current_path).to eq(account_path)
    end

  end
end
