require "rails_helper"

describe "BudgetPolls", :with_frozen_time do
  let(:budget) { create(:budget, :balloting) }
  let(:investment) { create(:budget_investment, :selected, budget: budget) }
  let(:poll) { create(:poll, budget: budget) }
  let(:booth) { create(:poll_booth) }
  let(:officer) { create(:poll_officer) }
  let!(:user) { create(:user, :in_census) }

  before do
    create(:poll_shift, officer: officer, booth: booth, date: Date.current, task: :vote_collection)
    create(:poll_officer_assignment, officer: officer, poll: poll, booth: booth, date: Date.current)
  end

  context "Offline" do
    scenario "A citizen can cast a paper vote" do
      admin = create(:administrator).user
      login_through_form_as_officer(officer)

      visit new_officing_residence_path
      officing_verify_residence

      expect(page).to have_content poll.name

      within("#poll_#{poll.id}") do
        click_button("Confirm vote")
        expect(page).not_to have_button("Confirm vote")
        expect(page).to have_content "Vote introduced!"
      end

      logout
      login_as(admin)
      visit admin_poll_recounts_path(poll)

      within("#total_system") do
        expect(page).to have_content "1"
      end

      within "tr", text: booth.name do
        expect(page).to have_content "1"
      end
    end

    scenario "A citizen cannot vote offline again" do
      login_through_form_as_officer(officer)

      visit new_officing_residence_path
      officing_verify_residence

      within("#poll_#{poll.id}") do
        click_button("Confirm vote")

        expect(page).to have_content "Vote introduced"
      end

      visit new_officing_residence_path
      officing_verify_residence

      within("#poll_#{poll.id}") do
        expect(page).to have_content "Has already participated in this poll"
      end
    end

    scenario "A citizen cannot vote online after voting offline" do
      login_through_form_as_officer(officer)

      visit new_officing_residence_path
      officing_verify_residence

      within("#poll_#{poll.id}") do
        click_button("Confirm vote")
      end

      expect(page).to have_content "Vote introduced!"

      login_as(user)

      visit budget_investment_path(budget, investment)

      within("#budget_investment_#{investment.id}") do
        click_button "Vote"

        expect(page).to have_content "You have already participated offline"
        expect(page).not_to have_button "Vote", disabled: :all
      end
    end
  end

  context "Online" do
    scenario "A citizen can cast vote online" do
      login_as(user)
      visit budget_investment_path(budget, investment)

      within("#budget_investment_#{investment.id}") do
        click_button "Vote"
        expect(page).to have_content "Remove"
      end
    end

    scenario "A citizen cannot vote online again" do
      login_as(user)
      visit budget_investment_path(budget, investment)

      within("#budget_investment_#{investment.id}") do
        click_button "Vote"
        expect(page).to have_content "Remove"
      end

      refresh

      within("#budget_investment_#{investment.id}") do
        expect(page).to have_content "Remove vote"
      end
    end

    scenario "A citizen cannot vote offline after voting online" do
      login_as(user)
      visit budget_investment_path(budget, investment)

      within("#budget_investment_#{investment.id}") do
        click_button "Vote"
        expect(page).to have_content "Remove"
      end

      logout
      login_through_form_as_officer(officer)

      visit new_officing_residence_path
      officing_verify_residence

      expect(page).to have_content poll.name

      within("#poll_#{poll.id}") do
        expect(page).not_to have_button("Confirm vote")
        expect(page).to have_content("Has already participated in this poll")
      end
    end
  end
end
