Given(/^my product name is (.*?)$/) do |name|
  @product_name = name
  Support::Helpers::ScenarioVariables.add_scenario_variable("Product name: ", @product_name)
end

Given(/^my project name is (.*?)$/) do |name|
  @project_name = name
  Support::Helpers::ScenarioVariables.add_scenario_variable("Project name: ", @project_name)
end

When(/^I search for a product with a product code of (.*?)$/) do |code|
  on(ReactWorkstation::ReactHomePage) do |page|
    page.goto unless page.current_url == page.page_url_value
    @global_search_query = code
    page.global_search_releases_input_box_element.wait_until(&:present?)
    page.global_search_releases_input_box = @global_search_query
    Support::Helpers::ScenarioVariables.add_scenario_variable("Global Search Query: ", @global_search_query)
  end
end

When(/^I search for a project with a project code of (.*?)$/) do |code|
  on(ReactWorkstation::ReactHomePage) do |page|
    page.goto unless page.current_url == page.page_url_value
    @global_search_query = code
    page.global_search_releases_input_box_element.wait_until(&:present?)
    page.global_search_releases_input_box = @global_search_query
    Support::Helpers::ScenarioVariables.add_scenario_variable("Global Search Query: ", @global_search_query)
  end
end

When(/^I select the first result in the results dropdown$/) do
  on(ReactWorkstation::ReactHomePage) do |page|
    page.wait_until { page.search_results_elements.any? }
    page.search_results_elements.first.click
  end
end

Then(/^I should be on the overview page of my selected product$/) do
  on(Project::DigitalProductOverviewPage) do |page|
    expect(page.product_code).to eq @global_search_query
  end
end

Then(/^I should see my product in the result list$/) do
  on(ReactWorkstation::ReactHomePage) do |page|
    page.wait_until { page.search_results_elements.any? }
    page.wait_until { page.search_results_elements.first.text.present? }
    page.wait_until { page.react_loader_element.when_not_present }
    expect(page.search_results_elements.first.text).to include @product_name
  end
end

Then(/^I should see my project in the result list$/) do
  on(ReactWorkstation::ReactHomePage) do |page|
    page.wait_until { page.search_results_elements.any? }
    page.wait_until { page.search_results_elements.first.text.present? }
    page.wait_until { page.react_loader_element.when_not_present }
    expect(page.search_results_elements.first.text).to include @project_name
  end
end

Then(/^I should be on the overview page of my selected project$/) do
  on(Project::ProjectDetailsPage) do |page|
    expect(page.project_code).to eq @global_search_query
  end
end

When(/^I search products by partial name$/) do
  @gs_project_name = "Jacob's First Release"
  @gs_partial_name = "Jac's"
  @gs_full_name_dig = "Jac's First Digital Product"
  @gs_full_name_phys = "Jac's Single"
  @gs_artist_name = "Jac Bertsch"
  @gs_upc = "192562130728"

  on(ReactWorkstation::ReactHomePage) do |page|
    page.goto unless page.current_url == page.page_url_value
    page.global_search_releases_input_box_element.wait_until(&:present?)
    page.global_search_releases_input_box = @gs_partial_name
    page.global_search_loader_element.wait_while(&:present?)
    page.wait_until { page.search_results_elements.any? }
    page.wait_until { page.react_loader_element.when_not_present }
  end
end

Then(/^I should see both digital and physical products in results dropdown$/) do
  on(ReactWorkstation::ReactHomePage) do |page|
    page.wait_until { page.search_results_elements.any? }
    page.wait_until { page.react_loader_element.when_not_present }
    page.wait_until { page.search_results_elements.first.text.present? }
    results = page.search_results_elements
    expect(results.find { |x| x.text.include? @gs_full_name_dig }.present?).to eq true
    expect(results.find { |x| x.text.include? @gs_full_name_phys }.present?).to eq true
  end
end

When(/^I search by (UPC|artist name)$/) do |search_type|
  case search_type
  when "UPC"
    search_term = @gs_upc
  when "artist name"
    search_term = @gs_artist_name
  end
  on(ReactWorkstation::ReactHomePage) do |page|
    page.global_search_releases_input_box_element.clear_text_and_type search_term
    page.global_search_loader_element.wait_while(&:present?) if page.global_search_loader?
    sleep 2 # Ugh. Quicker than storing each individual result and comparing them.
    # ^ Only accurate way to make sure the search results are updated is to compare the results
    # against the previous results and see if they changed. Too much complexity for this test.
    page.wait_until { page.search_results_elements.any? }
    page.wait_until { page.react_loader_element.when_not_present }
    eventually(timeout: 15) do
      page.search_results_elements.each { |result| expect(result.text).to include search_term }
    end
  end
end

Then(/^I should see both projects and products matching the criteria in results dropdown$/) do
  on(ReactWorkstation::ReactHomePage) do |page|
    page.wait_until do
      results = page.search_results_elements
      expect(results.find { |x| x.text.include? @gs_project_name }.present?).to eq true
      expect(results.find { |x| x.text.include? @gs_full_name_phys }.present?).to eq true
      expect(results.find { |x| x.text.include? @gs_full_name_dig }.present?).to eq true
      results.each { |result| expect(result.text).to include @gs_artist_name }
    end
  end
end

Then(/^I should only see the matching product in the results dropdown$/) do
  on(ReactWorkstation::ReactHomePage) do |page|
    eventually { expect(page.search_results_elements.first.text).to include @gs_upc }
  end
end
