require "rails_helper"

describe "Admin poll questions", :admin do
  scenario "Index" do
    poll1 = create(:poll, :future)
    poll2 = create(:poll, :future)
    proposal = create(:proposal)
    question1 = create(:poll_question, poll: poll1)
    question2 = create(:poll_question, poll: poll2, proposal: proposal)

    visit admin_poll_path(poll1)
    expect(page).to have_content(poll1.name)

    within("#poll_question_#{question1.id}") do
      expect(page).to have_content(question1.title)
      expect(page).to have_link "Edit answers"
      expect(page).to have_link "Edit"
      expect(page).to have_button "Delete"
    end

    visit admin_poll_path(poll2)
    expect(page).to have_content(poll2.name)

    within("#poll_question_#{question2.id}") do
      expect(page).to have_content question2.title
      expect(page).to have_link "(See proposal)", href: proposal_path(question2.proposal)
      expect(page).to have_link "Edit answers"
      expect(page).to have_link "Edit"
      expect(page).to have_button "Delete"
    end
  end

  scenario "Show" do
    geozone = create(:geozone)
    poll = create(:poll, geozone_restricted_to: [geozone])
    question = create(:poll_question, poll: poll)

    visit admin_poll_path(poll)
    click_link "Edit answers"

    expect(page).to have_link "Go back", href: admin_poll_path(poll)
    expect(page).to have_content question.title
    expect(page).to have_content question.author.name
  end

  describe "Create" do
    scenario "Is possible for a not started poll" do
      poll = create(:poll, :future, name: "Movies")

      visit admin_poll_path(poll)
      click_link "Create question"

      expect(page).to have_content("Create question to poll Movies")
      expect(page).to have_css "input[id='poll_question_poll_id'][value='#{poll.id}']",
                               visible: :hidden

      fill_in "Question", with: "Star Wars: Episode IV - A New Hope"
      click_button "Save"

      expect(page).to have_content "Star Wars: Episode IV - A New Hope"
    end

    scenario "Is not possible for an already started poll" do
      visit admin_poll_path(create(:poll))

      expect(page).not_to have_link "Create question"
    end

    describe "With votation type" do
      before do
        poll = create(:poll, :future)
        visit admin_poll_path(poll)
        click_link "Create question"
        expect(page).to have_content "It's only possible to answer one time to the question."
      end

      scenario "Unique" do
        fill_in "Question", with: "Question with unique answer"
        select "Unique answer", from: "Votation type"

        expect(page).to have_content "It's only possible to answer one time to the question."
        expect(page).not_to have_content "Allows to choose multiple answers."
        expect(page).not_to have_field "Maximum number of votes"
        expect(page).not_to have_content "Open-ended question that allows users to provide " \
                                         "a single answer in their own words."

        click_button "Save"

        expect(page).to have_content "Question with unique answer"
        expect(page).to have_content "Unique answer"
        expect(page).not_to have_content "Maximum number of votes"
        expect(page).to have_link "Add answer"
        expect(page).to have_table "Valid answers"
      end

      scenario "Multiple" do
        fill_in "Question", with: "Question with multiple answers"
        select "Multiple answers", from: "Votation type"

        expect(page).not_to have_content "It's only possible to answer one time to the question."
        expect(page).to have_content "Allows to choose multiple answers."
        expect(page).not_to have_content "Open-ended question that allows users to provide " \
                                         "a single answer in their own words."

        fill_in "Maximum number of votes", with: 6
        click_button "Save"

        expect(page).to have_content "Question with multiple answers"
        expect(page).to have_content "Multiple answers"
        expect(page).to have_text "Maximum number of votes 6", normalize_ws: true
        expect(page).to have_link "Add answer"
        expect(page).to have_table "Valid answers"
      end

      scenario "Open-ended" do
        fill_in "Question", with: "What do you want?"
        select "Open-ended", from: "Votation type"

        expect(page).not_to have_content "Allows to choose multiple answers."
        expect(page).not_to have_field "Maximum number of votes"
        expect(page).to have_content "Open-ended question that allows users to provide " \
                                     "a single answer in their own words."

        click_button "Save"

        expect(page).to have_content "What do you want?"
        expect(page).to have_content "Open-ended"
        expect(page).not_to have_content "Maximum number of votes"
        expect(page).not_to have_link "Add answer"
        expect(page).not_to have_table "Valid answers"
      end
    end
  end

  scenario "Create from proposal" do
    create(:poll, :future, name: "Proposals")
    proposal = create(:proposal)

    visit admin_proposal_path(proposal)

    expect(page).not_to have_content("This proposal has reached the required supports")
    click_link "Add this proposal to a poll to be voted"

    expect(page).to have_current_path(new_admin_question_path, ignore_query: true)
    expect(page).to have_field("Question", with: proposal.title)

    select "Proposals", from: "Poll"

    click_button "Save"

    expect(page).to have_content(proposal.title)
  end

  scenario "Create from successful proposal" do
    create(:poll, :future, name: "Proposals")
    proposal = create(:proposal, :successful)

    visit admin_proposals_path
    click_link "Successful proposals"
    click_link "Create question"

    expect(page).to have_current_path(new_admin_question_path, ignore_query: true)
    expect(page).to have_field("Question", with: proposal.title)

    select "Proposals", from: "Poll"

    click_button "Save"

    expect(page).to have_content proposal.title
  end

  scenario "Update" do
    poll = create(:poll, :future)
    question = create(:poll_question_open, poll: poll)
    old_title = question.title
    new_title = "Vegetables are great and everyone should have one"

    visit admin_poll_path(poll)

    within("#poll_question_#{question.id}") do
      click_link "Edit"
    end

    expect(page).to have_link "Go back", href: admin_poll_path(poll)
    expect(page).to have_select "Votation type", selected: "Open-ended"
    expect(page).not_to have_content "Allows to choose multiple answers."
    expect(page).not_to have_field "Maximum number of votes"
    expect(page).to have_content "Open-ended question that allows users to provide " \
                                 "a single answer in their own words."

    fill_in "Question", with: new_title

    click_button "Save"

    expect(page).to have_content "Changes saved"
    expect(page).to have_content new_title
    expect(page).not_to have_content old_title
  end

  scenario "Destroy" do
    poll = create(:poll, :future)
    question1 = create(:poll_question, poll: poll)
    question2 = create(:poll_question, poll: poll)

    visit admin_poll_path(poll)

    within("#poll_question_#{question1.id}") do
      accept_confirm("Are you sure? This action will delete \"#{question1.title}\" and can't be undone.") do
        click_button "Delete"
      end
    end

    expect(page).not_to have_content question1.title
    expect(page).to have_content question2.title
    expect(page).to have_current_path admin_poll_path(poll)
  end

  context "Poll select box" do
    scenario "translates the poll name in options" do
      poll = create(:poll, :future, name_en: "Name in English", name_es: "Nombre en Español")
      proposal = create(:proposal)

      visit admin_proposal_path(proposal)
      click_link "Add this proposal to a poll to be voted"

      expect(page).to have_select("poll_question_poll_id", options: ["Select Poll", poll.name_en])

      select "Español", from: "Language:"

      expect(page).to have_select("poll_question_poll_id",
                                  options: ["Seleccionar votación", poll.name_es])
    end

    scenario "uses fallback if name is not translated to current locale",
             if: Globalize.fallbacks(:fr).reject { |locale| locale.match(/fr/) }.first == :es do
      poll = create(:poll, :future, name_en: "Name in English", name_es: "Nombre en Español")
      proposal = create(:proposal)

      visit admin_proposal_path(proposal)
      click_link "Add this proposal to a poll to be voted"

      expect(page).to have_select("poll_question_poll_id", options: ["Select Poll", poll.name_en])

      select "Français", from: "Language:"

      expect(page).to have_select("poll_question_poll_id",
                                  options: ["Sélectionner un vote", poll.name_es])
    end
  end
end
