require 'rails_helper'

feature 'Admin::Organizations' do

  background do
    administrator = create(:user)
    create(:administrator, user: administrator)

    login_as(administrator)
  end

  context "Index" do
    scenario "shows info on organizations with hidden users" do
      troll = create(:user, email: "trol@troller.com")
      create(:organization, user: troll, name: "Greentroll")
      org = create(:organization, name: "Human Rights")
      troll.hide

      visit admin_organizations_path

      expect(page).to have_content("Human Rights")
      expect(page).to have_content(org.user.email)
      expect(page).to_not have_content("Greentroll")
      expect(page).to_not have_content("trol@troller.com")
      expect(page).to have_content("There is also one organisation with no users or with a hidden user")
    end
  end

  context "Search" do

    background do
      @user = create(:user, email: "marley@humanrights.com", phone_number: "6764440002")
      create(:organization, user: @user, name: "Get up, Stand up")
    end

    scenario "returns no results if search term is empty" do
      visit admin_organizations_path
      expect(page).to have_content("Get up, Stand up")

      fill_in "term", with: "      "
      click_button "Search"

      expect(current_path).to eq(search_admin_organizations_path)
      within("#search-results") do
        expect(page).to_not have_content("Get up, Stand up")
      end
    end

    scenario "finds by name" do
      visit search_admin_organizations_path
      expect(page).to_not have_content("Get up, Stand up")

      fill_in "term", with: "Up, sta"
      click_button "Search"

      within("#search-results") do
        expect(page).to have_content("Get up, Stand up")
      end
    end

    scenario "finds by users email" do
      visit search_admin_organizations_path
      expect(page).to_not have_content("Get up, Stand up")

      fill_in "term", with: @user.email
      click_button "Search"

      within("#search-results") do
        expect(page).to have_content("Get up, Stand up")
      end
    end

    scenario "finds by users phone number" do
      visit search_admin_organizations_path
      expect(page).to_not have_content("Get up, Stand up")

      fill_in "term", with: @user.phone_number
      click_button "Search"

      within("#search-results") do
        expect(page).to have_content("Get up, Stand up")
      end
    end
  end

  scenario "Pending organizations have links to verify and reject" do
    organization = create(:organization)

    visit admin_organizations_path
    within("#organization_#{organization.id}") do
      expect(current_path).to eq(admin_organizations_path)
      expect(page).to have_link('Verify')
      expect(page).to have_link('Reject')

      click_on 'Verify'
    end
    expect(current_path).to eq(admin_organizations_path)
    expect(page).to have_content ('Verified')

    expect(organization.reload.verified?).to eq(true)
  end

  scenario "Verified organizations have link to reject" do
    organization = create(:organization, :verified)

    visit admin_organizations_path

    click_on "Verified"

    within("#organization_#{organization.id}") do
      expect(page).to have_content ('Verified')
      expect(page).to_not have_link('Verify')
      expect(page).to have_link('Reject')

      click_on 'Reject'
    end
    expect(current_path).to eq(admin_organizations_path)
    expect(page).to_not have_content (organization.name)

    click_on 'Rejected'
    expect(page).to have_content ('Rejected')
    expect(page).to have_content (organization.name)

    expect(organization.reload.rejected?).to eq(true)
  end

  scenario "Rejected organizations have link to verify" do
    organization = create(:organization, :rejected)

    visit admin_organizations_path
    click_on "Rejected"

    within("#organization_#{organization.id}") do
      expect(page).to have_link('Verify')
      expect(page).to_not have_link('Reject', exact: true)

      click_on 'Verify'
    end
    expect(current_path).to eq(admin_organizations_path)
    expect(page).to_not have_content (organization.name)
    click_on('Verified')

    expect(page).to have_content (organization.name)

    expect(organization.reload.verified?).to eq(true)
  end

  scenario "Current filter is properly highlighted" do
    visit admin_organizations_path
    expect(page).to_not have_link('Pending')
    expect(page).to have_link('All')
    expect(page).to have_link('Verified')
    expect(page).to have_link('Rejected')

    visit admin_organizations_path(filter: 'all')
    expect(page).to_not have_link('All')
    expect(page).to have_link('Pending')
    expect(page).to have_link('Verified')
    expect(page).to have_link('Rejected')

    visit admin_organizations_path(filter: 'pending')
    expect(page).to have_link('All')
    expect(page).to_not have_link('Pending')
    expect(page).to have_link('Verified')
    expect(page).to have_link('Rejected')

    visit admin_organizations_path(filter: 'verified')
    expect(page).to have_link('All')
    expect(page).to have_link('Pending')
    expect(page).to_not have_link('Verified')
    expect(page).to have_link('Rejected')

    visit admin_organizations_path(filter: 'rejected')
    expect(page).to have_link('All')
    expect(page).to have_link('Pending')
    expect(page).to have_link('Verified')
    expect(page).to_not have_link('Rejected')
  end

  scenario "Filtering organizations" do
    create(:organization, name: "Pending Organization")
    create(:organization, :rejected, name: "Rejected Organization")
    create(:organization, :verified, name: "Verified Organization")

    visit admin_organizations_path(filter: 'all')
    expect(page).to have_content('Pending Organization')
    expect(page).to have_content('Rejected Organization')
    expect(page).to have_content('Verified Organization')

    visit admin_organizations_path(filter: 'pending')
    expect(page).to have_content('Pending Organization')
    expect(page).to_not have_content('Rejected Organization')
    expect(page).to_not have_content('Verified Organization')

    visit admin_organizations_path(filter: 'verified')
    expect(page).to_not have_content('Pending Organization')
    expect(page).to_not have_content('Rejected Organization')
    expect(page).to have_content('Verified Organization')

    visit admin_organizations_path(filter: 'rejected')
    expect(page).to_not have_content('Pending Organization')
    expect(page).to have_content('Rejected Organization')
    expect(page).to_not have_content('Verified Organization')
  end

  scenario "Verifying organization links remember the pagination setting and the filter" do
    per_page = Kaminari.config.default_per_page
    (per_page + 2).times { create(:organization) }

    visit admin_organizations_path(filter: 'pending', page: 2)

    click_on('Verify', match: :first)

    expect(current_url).to include('filter=pending')
    expect(current_url).to include('page=2')
  end

end
