Given(/^I am on the Project::ProjectDetailsPage of a source project$/) do
  visit(Project::ProjectDetailsPage, using_params: {
          project_id: @project_a[:id],
          queries: @url_queries
        }) do |page|
    page.save_project_element.wait_until(&:present?)
    if page.project_success_message_element.present?
      @src_project = @project_b
      @dest_project = @project_a
    else
      @src_project = @project_a
      @dest_project = @project_b
    end
  end

  visit(
    Project::ProjectDetailsPage,
    using_params: {
      project_id: @src_project[:id],
      queries: @url_queries
    }
  ).save_project_element.wait_until(&:present?)
end

# rubocop:disable Metrics/BlockLength

When(/^I move product from source project to destination project for (digital|physical)$/) do |_option|
  # have to wait here for page to load, because sidebar is present from the start, but
  # clicking other elements won't open the modal until page content is loaded
  on(Project::ProjectDetailsPage).save_project_element.wait_until(&:present?)

  on(Project::ProjectDetailsPage) do |page|
    page.wait_until { page.sidebar_product_more_actions_elements.any? }
    page.active_physical_product_element.click
    page.move_product_option_element.wait_until(&:present?).click
  end

  on(Project::MoveProductModal) do |modal|
    modal.move_modal_element.wait_until(&:present?)

    enter_search_queue_again = proc do
      modal.search_field = @dest_project[:proj_code]
    end

    Retriable.retriable(on: Watir::Wait::TimeoutError, tries: 5, on_retry: enter_search_queue_again) do
      modal.wait_until(1) { modal.search_field_element.value == @dest_project[:proj_code] }
    end

    modal.wait_until(15) do
      row = modal.results_rows_elements.first
      row && row.text == @dest_project[:proj_code]
    end

    check_checkbox = proc do
      modal.single_results_checkbox_element.wait_until(&:present?).click
    end

    Retriable.retriable(on: Watir::Wait::TimeoutError, tries: 5, on_retry: check_checkbox) do
      modal.wait_until(1) do
        modal.single_results_checkbox_element
             .child
             .child
             .child
             .attribute_value("class")
             .include? "MoveProductResultsList-row-selected"
      end
    end

    modal.move
    modal.move_modal_element.wait_while(&:present?)
  end
end

# rubocop:enable Metrics/BlockLength

Then(/^product should be moved to destination project$/) do
  visit(Project::ProjectDetailsPage, using_params: {
          project_id: @dest_project[:id],
          queries: @url_queries
        }) do |page|
    page.wait_until { page.sidebar_product_more_actions_elements.any? }
    eventually(timeout: 10) do
      expect(page.sidebar_product_more_actions_elements.first.present?).to eq(true)
    end
  end
end

Then(/^product should be absent in a source project$/) do
  visit(Project::ProjectDetailsPage, using_params: {
          project_id: @src_project[:id],
          queries: @url_queries
        }) do |page|
    page.add_new_product_element.wait_until(&:present?)
    eventually(timeout: 10) do
      expect(page.sidebar_product_more_actions_elements.any?).to eq(false)
    end
  end
end
