features/step_definitions/aspects_steps.rb
# frozen_string_literal: true

module AspectCukeHelpers
  def click_aspect_dropdown
    find(".aspect-dropdown > .dropdown-toggle").click
  end

  def click_share_button
    find("#submit_new_message").trigger "click"
  end

  def toggle_aspect(a_name)
    a_id = if "Public" == a_name
             "public"
           else
             @me.aspects.where(name: a_name).pluck(:id).first
           end
    aspect_css = ".aspect-dropdown li[data-aspect_id='#{a_id}']"
    expect(page).to have_selector(aspect_css)
    find(aspect_css).click
  end

  def toggle_aspect_via_ui(aspect_name)
    aspects_dropdown = find(".aspect-membership-dropdown .dropdown-toggle", match: :first)
    aspects_dropdown.trigger "click"
    selected_aspect_count = all(".aspect-membership-dropdown.open .dropdown-menu li.selected", wait: false).length
    aspect = find(".aspect-membership-dropdown.open .dropdown-menu li", text: aspect_name)
    aspect_selected = aspect["class"].include? "selected"
    aspect.trigger "click"
    expect(find(".aspect-membership-dropdown .dropdown-menu", visible: false)).to have_no_css(".loading")

    # close dropdown
    page.should have_no_css('#profile.loading')
    unless selected_aspect_count == 0 or (selected_aspect_count == 1 and aspect_selected )
      aspects_dropdown.trigger "click"
    end
  end

  def aspect_dropdown_visible?
    expect(find('.aspect-membership-dropdown.open')).to be_visible
  end
end
World(AspectCukeHelpers)

Given /^I have an aspect called "([^\"]*)"$/ do |aspect_name|
  @me.aspects.create!(name: aspect_name)
  @me.reload
end

Given /^I have an aspect called "([^\"]*)" with auto follow back$/ do |aspect_name|
  aspect = @me.aspects.create!(name: aspect_name)
  @me.auto_follow_back = true
  @me.auto_follow_back_aspect = aspect
  @me.save
  @me.reload
end

Given /^I have following aspect[s]?:$/ do |fields|
  fields.raw.each do |field|
    @me.aspects.create!(name: field[0])
  end
  @me.reload
end

When /^I click on "([^"]*)" aspect edit icon$/ do |aspect_name|
  within(".all-aspects") do
    li = find('li', text: aspect_name)
    li.hover
    li.find('.modify_aspect').click
  end
end

When /^I select only "([^"]*)" aspect$/ do |aspect_name|
  click_link "My aspects"
  expect(find("#aspect-stream-container")).to have_css(".loader.hidden", visible: false)
  within("#aspects_list") do
    all(".selected", wait: false).each do |node|
      aspect_item = node.find(:xpath, "..")
      aspect_item.click
      expect(aspect_item).to have_no_css ".selected"
    end
    expect(current_scope).to have_no_css ".selected"
  end
  step %Q(I select "#{aspect_name}" aspect as well)
end

When /^I select "([^"]*)" aspect as well$/ do |aspect_name|
  within('#aspects_list') do
    click_link aspect_name
  end
  step %Q(I should see "#{aspect_name}" aspect selected)
end

When /^I select all aspects$/ do
  within('#aspects_list') do
    click_link "Select all"
  end
end

When /^I add the first person to the aspect$/ do
  find(".contact_add-to-aspect", match: :first).tap do |button|
    button.click
    button.query_scope.should have_css ".contact_remove-from-aspect"
  end
end

When /^I remove the first person from the aspect$/ do
  find(".contact_remove-from-aspect", match: :first).tap do |button|
    button.click
    button.query_scope.should have_css ".contact_add-to-aspect"
    sleep 1 # The expectation above should wait for the request to finsh, but that doesn't work for some reason
  end
end

When /^I press the aspect dropdown$/ do
  click_aspect_dropdown
end

When /^I press the share button$/ do
  # There were issues 'clicking' the share button on mobile
  click_share_button
end

When /^I visit the stream with aspect "([^"]*)"$/ do |aspect_name|
  # In mobile view aspects are single anchors
  a_id = @me.aspects.where(name: aspect_name).pick(:id)
  visit("/aspects?a_ids[]=#{a_id}")
end

When /^(.*) in the aspect creation modal$/ do |action|
  within("#newAspectModal") do
    step action
  end
end

When /^I drag "([^"]*)" (up|down)$/ do |aspect_name, direction|
  expect(page).to have_js_defined("$('body').sortable")
  page.execute_script("$('#aspect_nav .list-group').sortable('option', 'tolerance', 'pointer');")
  aspect_id = @me.aspects.where(name: aspect_name).first.id
  aspect = find(:xpath, "//div[@id='aspect_nav']/ul/a[@data-aspect-id='#{aspect_id}']")
  target = direction == "up" ? aspect.all(:xpath, "./preceding-sibling::a").last :
                               aspect.all(:xpath, "./following-sibling::a").first
  aspect.drag_to target
  expect(page).to have_no_css "#aspect_nav .ui-sortable.syncing"
end

And /^I toggle the aspect "([^"]*)"$/ do |name|
  toggle_aspect(name)
end

Then /^I should see "([^"]*)" within the contact aspect dropdown$/ do |aspect_name|
  expect(find(".dropdown-toggle .text")).to have_content aspect_name
end

Then /^I should see "([^"]*)" aspect selected$/ do |aspect_name|
  aspect = @me.aspects.where(:name => aspect_name).first
  within("#aspects_list") do
    current_scope.should have_css "li[data-aspect_id='#{aspect.id}'] .selected"
  end
end

Then /^I should see "([^"]*)" aspect unselected$/ do |aspect_name|
  aspect = @me.aspects.where(:name => aspect_name).first
  within("#aspects_list") do
    current_scope.should have_no_css "li[data-aspect_id='#{aspect.id}'] .selected"
  end
end

Then /^the aspect dropdown should be visible$/ do
  aspect_dropdown_visible?
end

Then /^I should see "([^"]*)" as (\d+). aspect$/ do |aspect_name, position|
  expect(find("#aspect_nav a:nth-child(#{position.to_i + 2})")).to have_text aspect_name
end
