require 'rails_helper'

feature 'Account' do

  background do
    @user = create(:user, username: "Manuela Colau")
    login_as(@user)
  end

  scenario 'Show' do
    visit root_path

    click_link "My account"

    expect(page).to have_current_path(account_path, ignore_query: true)

    expect(page).to have_selector("input[value='Manuela Colau']")
    expect(page).to have_selector(avatar('Manuela Colau'), count: 1)
  end

  scenario 'Show organization' do
    create(:organization, user: @user, name: "Manuela Corp")

    visit account_path

    expect(page).to have_selector("input[value='Manuela Corp']")
    expect(page).not_to have_selector("input[value='Manuela Colau']")

    expect(page).to have_selector(avatar('Manuela Corp'), count: 1)
  end

  scenario 'Edit' do
    visit account_path

    fill_in 'account_username', with: 'Larry Bird'
    check 'account_email_on_comment'
    check 'account_email_on_comment_reply'
    uncheck 'account_email_digest'
    uncheck 'account_email_on_direct_message'
    click_button 'Save changes'

    expect(page).to have_content "Changes saved"

    visit account_path

    expect(page).to have_selector("input[value='Larry Bird']")
    expect(find("#account_email_on_comment")).to be_checked
    expect(find("#account_email_on_comment_reply")).to be_checked
    expect(find("#account_email_digest")).not_to be_checked
    expect(find("#account_email_on_direct_message")).not_to be_checked
  end

  scenario 'Edit email address' do
    visit account_path

    click_link "Change my credentials"
    fill_in "user_email", with: "new_user_email@example.com"
    fill_in "user_password", with: "new_password"
    fill_in "user_password_confirmation", with: "new_password"
    fill_in "user_current_password", with: "judgmentday"

    click_button "Update"

    notice = 'Your account has been updated successfully;'\
             ' however, we need to verify your new email address.'\
             ' Please check your email and click on the link to'\
             ' complete the confirmation of your new email address.'
    expect(page).to have_content notice

    email = open_last_email
    visit_in_email("Confirm my account")

    logout
    visit root_path
    click_link "Sign in"
    fill_in "user_login", with: "new_user_email@example.com"
    fill_in "user_password", with: "new_password"
    click_button "Enter"

    expect(page).to have_content "You have been signed in successfully."

    visit account_path
    click_link "Change my credentials"
    expect(page).to have_selector("input[value='new_user_email@example.com']")
  end

  scenario 'Edit Organization' do
    create(:organization, user: @user, name: "Manuela Corp")
    visit account_path

    fill_in 'account_organization_attributes_name', with: 'Google'
    check 'account_email_on_comment'
    check 'account_email_on_comment_reply'

    click_button 'Save changes'

    expect(page).to have_content "Changes saved"

    visit account_path

    expect(page).to have_selector("input[value='Google']")
    expect(find("#account_email_on_comment")).to be_checked
    expect(find("#account_email_on_comment_reply")).to be_checked
  end

  context "Option to display badge for official position" do

    scenario "Users with official position of level 1" do
      official_user = create(:user, official_level: 1)

      login_as(official_user)
      visit account_path

      check 'account_official_position_badge'
      click_button 'Save changes'
      expect(page).to have_content "Changes saved"

      visit account_path
      expect(find("#account_official_position_badge")).to be_checked
    end

    scenario "Users with official position of level 2 and above" do
      official_user2 = create(:user, official_level: 2)
      official_user3 = create(:user, official_level: 3)

      login_as(official_user2)
      visit account_path

      expect(page).not_to have_css '#account_official_position_badge'

      login_as(official_user3)
      visit account_path

      expect(page).not_to have_css '#account_official_position_badge'
    end

  end

  scenario "Errors on edit" do
    visit account_path

    fill_in 'account_username', with: ''
    click_button 'Save changes'

    expect(page).to have_content error_message
  end

  scenario 'Errors editing credentials' do
    visit root_path

    click_link 'My account'

    expect(page).to have_current_path(account_path, ignore_query: true)

    expect(page).to have_link('Change my credentials')
    click_link 'Change my credentials'
    click_button 'Update'

    expect(page).to have_content error_message
  end

  scenario 'Erasing account' do
    visit account_path

    click_link 'Erase my account'

    fill_in 'user_erase_reason', with: 'a test'

    click_button 'Erase my account'

    expect(page).to have_content "Goodbye! Your account has been cancelled. We hope to see you again soon."

    login_through_form_as(@user)

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

  context 'Recommendations' do

    background do
      Setting['feature.user.recommendations'] = true
      Setting['feature.user.recommendations_on_debates'] = true
      Setting['feature.user.recommendations_on_proposals'] = true
    end

    after do
      Setting['feature.user.recommendations'] = nil
      Setting['feature.user.recommendations_on_debates'] = nil
      Setting['feature.user.recommendations_on_proposals'] = nil
    end

    scenario 'are enabled by default' do
      visit account_path

      expect(page).to have_content('Recommendations')
      expect(page).to have_content('Show debates recommendations')
      expect(page).to have_content('Show proposals recommendations')
      expect(find("#account_recommended_debates")).to be_checked
      expect(find("#account_recommended_proposals")).to be_checked
    end

    scenario "can be disabled through 'My account' page" do
      visit account_path

      expect(page).to have_content('Recommendations')
      expect(page).to have_content('Show debates recommendations')
      expect(page).to have_content('Show proposals recommendations')
      expect(find("#account_recommended_debates")).to be_checked
      expect(find("#account_recommended_proposals")).to be_checked

      uncheck 'account_recommended_debates'
      uncheck 'account_recommended_proposals'

      click_button 'Save changes'

      expect(find("#account_recommended_debates")).not_to be_checked
      expect(find("#account_recommended_proposals")).not_to be_checked

      @user.reload

      expect(@user.recommended_debates).to be(false)
      expect(@user.recommended_proposals).to be(false)
    end

  end
end
