# Set up a new/unsaved gift exchange

Given /^I have set up the gift exchange "([^\"]*)" with name "([^\"]*)"$/ do |challengename, name|
  step %{I am logged in as "mod1"}
    step "I have standard challenge tags setup"
    step %{I set up the collection "#{challengename}" with name "#{name}"}
    step %{I select "Gift Exchange" from "challenge_type"}
  click_button("Submit")
end

Given /^I have set up the gift exchange "([^\"]*)"$/ do |challengename|
  step %{I have set up the gift exchange "#{challengename}" with name "#{challengename.gsub(/[^\w]/, '_')}"}
end

Then /^"([^\"]*)" gift exchange should be correctly created$/ do |title|
  step %{I should see "Collection was successfully created"}
  step %{I should see "Setting Up the #{title} Gift Exchange"}
  step %{I should see "Offer Settings"}
  step %{I should see "Request Settings"}
  step %{I should see "If you plan to use automated matching"}
  step %{I should see "Allow Any"}
end

Then /^I should see gift exchange options$/ do
  step %{I should see "Offer Settings"}
    step %{I should see "Request Settings"}
    step %{I should see "If you plan to use automated matching"}
    step %{I should see "Allow Any"}
end

# Create and save a gift exchange with some common options

Given /^I have created the gift exchange "([^\"]*)" with name "([^\"]*)"$/ do |challengename, name|
  step %{I have set up the gift exchange "#{challengename}" with name "#{name}"}
  step "I fill in gift exchange challenge options"
    step "I submit"
  step %{I should see "Challenge was successfully created"}
end

Given /^I have created the gift exchange "([^\"]*)"$/ do |challengename|
  step %{I have created the gift exchange "#{challengename}" with name "#{challengename.gsub(/[^\w]/, '_')}"}
end

Given /^I have created the tagless gift exchange "([^\"]*)" with name "([^\"]*)"$/ do |challengename, name|
  step %{I have set up the gift exchange "#{challengename}" with name "#{name}"}
  step "I submit"
  step %{I should see "Challenge was successfully created"}
end

Given /^I have created the tagless gift exchange "([^\"]*)"$/ do |challengename|
  step %{I have created the tagless gift exchange "#{challengename}" with name "#{challengename.gsub(/[^\w]/, '_')}"}
end

When /^I fill in gift exchange challenge options$/ do
  current_date = DateTime.current
  fill_in("Sign-up opens", with: "#{current_date.months_ago(2)}")
    fill_in("Sign-up closes", with: "#{current_date.years_since(1)}")
    select("(GMT-05:00) Eastern Time (US & Canada)", from: "gift_exchange_time_zone")
    fill_in("Tag Sets To Use:", with: "Standard Challenge Tags")
    fill_in("gift_exchange_request_restriction_attributes_fandom_num_required", with: "1")
    fill_in("gift_exchange_request_restriction_attributes_fandom_num_allowed", with: "1")
    fill_in("gift_exchange_request_restriction_attributes_freeform_num_allowed", with: "2")
    fill_in("gift_exchange_offer_restriction_attributes_fandom_num_required", with: "1")
    fill_in("gift_exchange_offer_restriction_attributes_fandom_num_allowed", with: "1")
    fill_in("gift_exchange_offer_restriction_attributes_freeform_num_allowed", with: "2")
    select("1", from: "gift_exchange_potential_match_settings_attributes_num_required_fandoms")
end

When /^I fill in single-fandom gift exchange challenge options$/ do
  current_date = DateTime.current
  fill_in("Sign-up opens", with: current_date.months_ago(2).to_s)
  fill_in("Sign-up closes", with: current_date.years_since(1).to_s)
  select("(GMT-05:00) Eastern Time (US & Canada)", from: "gift_exchange_time_zone")
  fill_in("gift_exchange_request_restriction_attributes_fandom_num_required", with: "1")
  fill_in("gift_exchange_request_restriction_attributes_fandom_num_allowed", with: "1")
  fill_in("gift_exchange_request_restriction_attributes_character_num_required", with: "1")
  fill_in("gift_exchange_request_restriction_attributes_character_num_allowed", with: "3")
  fill_in("gift_exchange_request_restriction_attributes_relationship_num_allowed", with: "3")
  fill_in("gift_exchange_request_restriction_attributes_rating_num_allowed", with: "5")
  fill_in("gift_exchange_request_restriction_attributes_category_num_allowed", with: "5")
  fill_in("gift_exchange_request_restriction_attributes_archive_warning_num_allowed", with: "5")
  fill_in("gift_exchange_request_restriction_attributes_freeform_num_allowed", with: "2")
  fill_in("gift_exchange_offer_restriction_attributes_fandom_num_required", with: "1")
  fill_in("gift_exchange_offer_restriction_attributes_fandom_num_allowed", with: "1")
  fill_in("gift_exchange_offer_restriction_attributes_character_num_allowed", with: "3")
  fill_in("gift_exchange_offer_restriction_attributes_freeform_num_allowed", with: "2")
  select("1", from: "gift_exchange_potential_match_settings_attributes_num_required_characters")
  check("gift_exchange_offer_restriction_attributes_allow_any_rating")
  check("gift_exchange_offer_restriction_attributes_allow_any_category")
  check("gift_exchange_offer_restriction_attributes_allow_any_archive_warning")
  check("gift_exchange_offer_restriction_attributes_character_restrict_to_fandom")
  check("gift_exchange_offer_restriction_attributes_relationship_restrict_to_fandom")
end

When /^I allow warnings in my gift exchange$/ do
  fill_in("gift_exchange_request_restriction_attributes_archive_warning_num_allowed", with: "1")
  check("gift_exchange_request_restriction_attributes_allow_any_archive_warning")
  fill_in("gift_exchange_offer_restriction_attributes_archive_warning_num_allowed", with: "1")
  check("gift_exchange_offer_restriction_attributes_allow_any_archive_warning")
end

Then /^"([^\"]*)" gift exchange should be fully created$/ do |title|
  step %{I should see a create confirmation message}
  step %{"#{title}" collection exists}
  step %{I should see "(Open, Unmoderated, Gift Exchange Challenge)"}
end

Given /^the gift exchange "([^\"]*)" is ready for signups$/ do |title|
  step %{I am logged in as "mod1"}
  step %{I have created the gift exchange "#{title}"}
  step %{I open signups for "#{title}"}
end

# This is going to make broken assignments a la AO3-5748
Given /^"(.*?)" has two pinchhit assignments in the gift exchange "(.*?)"$/ do |user, collection_title|
  collection = Collection.find_by(title: collection_title)
  user = User.find_by(login: user)
  assignments = ChallengeAssignment.where(collection_id: collection.id).limit(2)
  assignments.each do |a|
    a.pinch_hitter_id = user.default_pseud_id
    a.save
    a.reload
  end
end

## Signing up

When /^I set up a signup for "([^\"]*)" with combination A$/ do |title|
  step %{I start signing up for "#{title}"}
  step %{I check the 1st checkbox with the value "Stargate Atlantis"}
  step %{I check the 2nd checkbox with value "Stargate SG-1"}
  step %{I fill in the 1st field with id matching "freeform_tagnames" with "Alternate Universe - Historical"}
  step %{I fill in the 2nd field with id matching "freeform_tagnames" with "Alternate Universe - High School"}
end

When /^I sign up for "([^\"]*)" with combination A$/ do |title|
  step %{I set up a signup for "#{title}" with combination A}
  click_button "Submit"
end

When "I sign up for {string} with combination A and my pseud {string}" do |title, pseud_name|
  step %{I set up a signup for "#{title}" with combination A}
  select pseud_name, from: "challenge_signup[pseud_id]"
  click_button "Submit"
end

When /^I attempt to sign up for "([^\"]*)" with a pseud that is not mine$/ do |title|
  step %{the user "gooduser" exists and is activated}
  step %{I am logged in as "baduser"}
  step %{I set up a signup for "#{title}" with combination A}
  pseud_id = Pseud.where(name: "gooduser").first.id
  find("#challenge_signup_pseud_id", visible: false).set(pseud_id)
  click_button "Submit"
end

When /^I attempt to update my signup for "([^\"]*)" with a pseud that is not mine$/ do |title|
  step %{the user "gooduser" exists and is activated}
  step %{I am logged in as "baduser"}
  step %{I sign up for "#{title}" with combination A}
  step %{I follow "Edit Sign-up"}
  pseud_id = Pseud.where(name: "gooduser").first.id
  find("#challenge_signup_pseud_id", visible: false).set(pseud_id)
  click_button "Update"
end

When /^I sign up for "([^\"]*)" with combination B$/ do |title|
  step %{I start signing up for "#{title}"}
    step %{I check the 1st checkbox with value "Stargate SG-1"}
    step %{I check the 2nd checkbox with the value "Stargate Atlantis"}
    step %{I fill in the 1st field with id matching "freeform_tagnames" with "Alternate Universe - High School, Something else weird"}
    step %{I fill in the 2nd field with id matching "freeform_tagnames" with "Alternate Universe - High School"}
    click_button "Submit"
end

When /^I sign up for "([^\"]*)" with combination C$/ do |title|
  step %{I start signing up for "#{title}"}
    step %{I check the 1st checkbox with the value "Stargate SG-1"}
    step %{I check the 2nd checkbox with the value "Stargate SG-1"}
    step %{I fill in the 1st field with id matching "freeform_tagnames" with "Something else weird"}
    step %{I fill in the 2nd field with id matching "freeform_tagnames" with "Something else weird"}
    click_button "Submit"
end

When /^I sign up for "([^\"]*)" with combination D$/ do |title|
  step %{I start signing up for "#{title}"}
    step %{I check the 1st checkbox with the value "Stargate Atlantis"}
    step %{I check the 2nd checkbox with the value "Stargate Atlantis"}
    step %{I fill in the 1st field with id matching "freeform_tagnames" with "Something else weird, Alternate Universe - Historical"}
    step %{I fill in the 2nd field with id matching "freeform_tagnames" with "Something else weird, Alternate Universe - Historical"}
    click_button "Submit"
end

When /^I sign up for "([^\"]*)" with a mismatched combination$/ do |title|
  step %{I start signing up for "#{title}"}
    step %{I check the 1st checkbox with the value "Bad Choice"}
    step %{I check the 2nd checkbox with the value "Bad Choice"}
    click_button "Submit"
end


When /^I sign up for "([^\"]*)" with combination SGA$/ do |title|
  step %{I start signing up for "#{title}"}
    step %{I fill in "challenge_signup_requests_attributes_0_tag_set_attributes_fandom_tagnames" with "Stargate Atlantis"}
    fill_in("challenge_signup_requests_attributes_0_title", with: "SGA love")
    click_button "Submit"
end

When /^I sign up for "([^\"]*)" with combination SG-1$/ do |title|
  step %{I start signing up for "#{title}"}
    step %{I fill in "challenge_signup_requests_attributes_0_tag_set_attributes_fandom_tagnames" with "Stargate SG-1"}
    fill_in("challenge_signup_requests_attributes_0_title", with: "SG1 love")
    click_button "Submit"
end

When /^I sign up for "([^\"]*)" with missing prompts$/ do |title|
  step %{I start signing up for "#{title}"}
    step %{I check the 1st checkbox with the value "Stargate Atlantis"}
    step %{I fill in the 1st field with id matching "freeform_tagnames" with "Something else weird"}
    click_button "Submit"
end

When /^I start to sign up for "([^\"]*)"$/ do |title|
  step %{I start signing up for "#{title}"}
    step %{I check the 1st checkbox with value "Stargate SG-1"}
end

When /^I start to sign up for "([^\"]*)" tagless gift exchange$/ do |title|
  visit collection_path(Collection.find_by(title: title))
  step %{I follow "Sign Up"}
  step %{I fill in "Description" with "random text"}
  step %{I press "Submit"}
  step %{I should see "Sign-up was successfully created"}
end

Then "I should see participant number {int} with byline {string}" do |num, byline|
  within(:xpath, ".//dt[@class=\"participant\"][#{num}]") { expect(page).to have_content(byline) }
end

Then "I should see all the participants who have signed up" do
  step %{I should see participant number 1 with byline "myname1_pseud (myname1)"}
  step %{I should see participant number 2 with byline "myname2"}
  step %{I should see participant number 3 with byline "myname3"}
  step %{I should see participant number 4 with byline "myname4"}
end

## Matching

Given /^the gift exchange "([^\"]*)" is ready for matching$/ do |title|
  step %{the gift exchange "#{title}" is ready for signups}
  step %{everyone has signed up for the gift exchange "#{title}"}
end

Given /^I create an invalid signup in the gift exchange "([^\"]*)"$/ do |challengename|
  collection = Collection.find_by(title: challengename)
  # create an invalid signup by deleting the first one's offers,
  # bypassing the validation checks
  collection.signups.first.offers.delete_all
end

When /^I remove a recipient$/ do
  step %{I fill in the 1st field with id matching "_request_signup_pseud" with ""}
end

When /^I assign a recipient to herself$/ do
  first_recip_field = page.all("input[type='text']").select {|el| el['id'] && el['id'].match(/_request_signup_pseud/)}[0]
  recip = first_recip_field['value']
  id = first_recip_field['id']
  if id.match(/assignments_(\d+)_request/)
    num = $1
    fill_in "challenge_assignments_#{num}_offer_signup_pseud", with: recip
  end
end

When /^I manually destroy the assignments for "([^\"]*)"$/ do |title|
  collection = Collection.find_by(title: title)
  collection.assignments.destroy_all
end

When /^I assign a pinch hitter$/ do
  step %{I fill in the 1st field with id matching "pinch_hitter_byline" with "mod1"}
end

When /^I assign a pinch recipient$/ do
  name = page.all("td").select {|el| el['id'] && el['id'].match(/offer_signup_for/)}[0].text
  pseud = Pseud.find_by(name: name)
  request_pseud = ChallengeSignup.where(pseud_id: pseud.id).first.offer_potential_matches.first.request_signup.pseud.byline
  step %{I fill in the 1st field with id matching "request_signup_pseud" with "#{request_pseud}"}
end

Given /^everyone has signed up for the gift exchange "([^\"]*)"$/ do |challengename|
  step %{I am logged in as "myname1"}
  pseud = User.find_by(login: "myname1").pseuds.find_or_create_by(name: "myname1_pseud")
  step %{I sign up for "#{challengename}" with combination A and my pseud "#{pseud.name}"}
  step %{I am logged in as "myname2"}
  step %{I sign up for "#{challengename}" with combination B}
  step %{I am logged in as "myname3"}
  step %{I sign up for "#{challengename}" with combination C}
  step %{I am logged in as "myname4"}
  step %{I sign up for "#{challengename}" with combination D}
end

Given /^I have generated matches for "([^\"]*)"$/ do |challengename|
  step %{I close signups for "#{challengename}"}
  step %{I follow "Matching"}
  step %{I press "Generate Potential Matches"}
  step %{I reload the page}
  step %{all emails have been delivered}
end

Given /^I have sent assignments for "([^\"]*)"$/ do |challengename|
  step %{I press "Send Assignments"}
  step %{I reload the page}
  step %{I should not see "Assignments are now being sent out"}
end

Given /^everyone has their assignments for "([^\"]*)"$/ do |challenge_title|
  step %{the gift exchange "#{challenge_title}" is ready for matching}
  step %{I have generated matches for "#{challenge_title}"}
  step %{I have sent assignments for "#{challenge_title}"}
end

Given "{string} has an assignment for the user {string} in the collection {string}" do |giver_login, recip_login, collection_name|
  giver = User.find_by(login: giver_login)
  recip = User.find_by(login: recip_login)
  collection = FactoryBot.create(:collection, name: collection_name, title: collection_name)
  assignment = FactoryBot.create(:challenge_assignment, sent_at: Time.zone.now, collection_id: collection.id)
  assignment.offer_signup.update_column(:pseud_id, giver.default_pseud_id)
  assignment.request_signup.update_column(:pseud_id, recip.default_pseud_id)
  assignment.reload
end

### Fulfilling assignments

When /^I start to fulfill my assignment$/ do
  step %{I follow "My Dashboard"}
  step %{I follow "Assignments ("}
  step %{I follow "Fulfill"}
    step %{I fill in "Work Title" with "Fulfilled Story"}
    step %{I select "Not Rated" from "Rating"}
    step %{I check "No Archive Warnings Apply"}
    step %{I select "English" from "Choose a language"}
    step %{I fill in "Fandom" with "Final Fantasy X"}
    step %{I fill in "content" with "This is a really cool story about Final Fantasy X"}
end

When /^I fulfill my assignment$/ do
  step %{I start to fulfill my assignment}
  step %{I press "Preview"}
    step %{I press "Post"}
  step %{I should see "Work was successfully posted"}
end

When /^an assignment has been fulfilled in a gift exchange$/ do
  step %{everyone has their assignments for "Awesome Gift Exchange"}
  step %{I am logged in as "myname1"}
  step %{I fulfill my assignment}
end

# we're not testing the process of rejection here, just that
# it doesn't affect the completion status of the challenge assignment
When /^I refuse my gift story "(.*?)"/ do |work|
  w = Work.find_by(title: work)
  w.gifts.first.toggle!(:rejected)
end

### WHEN we need the author attribute to be set
When /^I fulfill my assignment and the author is "([^\"]*)"$/ do |new_user|
  step %{I start to fulfill my assignment}
    step %{I select "#{new_user}" from "Author / Pseud(s)"}
  step %{I press "Preview"}
    step %{I press "Post"}
  step %{I should see "Work was successfully posted"}
end

When /^I have set up matching for "([^\"]*)" with no required matching$/ do |challengename|
  step %{I am logged in as "mod1"}
  step %{I have created the gift exchange "Awesome Gift Exchange"}
  step %{I open signups for "Awesome Gift Exchange"}
  step %{everyone has signed up for the gift exchange "Awesome Gift Exchange"}
end

### Deleting a gift exchange

Then /^I should not see the gift exchange dashboard for "([^\"]*)"$/ do |challenge_title|
  collection = Collection.find_by(title: challenge_title)
  visit collection_path(collection)
  step %{I should not see "Gift Exchange" within "#dashboard"}
  step %{I should not see "Sign-up Form" within "#dashboard"}
  step %{I should not see "My Sign-up" within "#dashboard"}
  step %{I should not see "Sign-ups" within "#dashboard"}
  step %{I should not see "Challenge Settings" within "#dashboard"}
  step %{I should not see "Sign-up Summary" within "#dashboard"}
  step %{I should not see "Requests Summary" within "#dashboard"}
  step %{I should not see "Matching" within "#dashboard"}
  step %{I should not see "Assignments" within "#dashboard"}
  step %{I should not see "Challenge Settings" within "#dashboard"}
end

Then /^no one should have an assignment for "([^\"]*)"$/ do |challenge_title|
  collection = Collection.find_by(title: challenge_title)
  User.all.each do |user|
    user.offer_assignments.in_collection(collection).should be_empty
    user.pinch_hit_assignments.in_collection(collection).should be_empty
  end
end

When "there are {int} assignments per page" do |amount|
  allow_any_instance_of(ApplicationController).to receive(:pagy_get_limit).and_return(amount)
end
