When(/^I search for releases in Workstation matching the term '(.*?)'$/) do |search_term|
  on ReactWorkstation::ReactHomePage do |page|
    visit(ReactWorkstation::ReactHomePage) unless page.current_url == "#{DOMAINS[:workstation]}/"
    page.wait_until { page.global_search_releases_input_box? }
    page.global_search_releases_input_box = search_term
    sleep 1 # clicking the search button doesn't work without this
    page.global_search_releases_button_element.click
  end
  on(Workstation::ReleaseBuilderPage) do |page|
    puts "There were no results for the search term" if page.no_results_found
  end
end

And(/^I sort by (.*?)$/) do |sort_by|
  on Workstation::ReleaseBuilderPage do |page|
    page.sort_by(sort_by.to_sym) unless page.no_results_found
  end
end

And(/^I arrange the (.*?) column in ascending order$/) do |sort_by|
  on Workstation::ReleaseBuilderPage do |page|
    unless page.no_results_found
      sorting_order = page.query_value_from_current_url("sortby")
      # If the sorting order is descending, click the link again to order in ascending order
      if sorting_order == sort_by.to_s && page.query_value_from_current_url("release_#{sort_by}") == "desc"
        page.sort_by(sort_by.to_sym)
        expect(page.current_url).to include "release_#{sort_by}=asc"
      end
    end
  end
end

Then(/^I should see the results in (.*?) order$/) do |order|
  on Workstation::ReleaseBuilderPage do |page|
    unless page.no_results_found
      col = order == "alphabetical" ? 1 : 4
      sorted_list = []
      sorted_rows = if page.manage_releases_table_element.rows <= 10
                      page.manage_releases_table_element.rows - 1
                    else
                      10
                    end
      (1..sorted_rows).each do |row|
        cell = page.manage_releases_table_element[row].cell_elements[col].div_element
        cell_text = cell.element.text.split("\n")[0]
        sorted_list.push(cell_text.downcase) unless cell_text.nil?
      end
      puts "Sorted list: #{sorted_list}"
      expect(sorted_list).to eq(sorted_list.sort)
    end
  end
end

And(/^I view releases with (.*?): (.*?)$/) do |filter_type, selected_filters|
  on Workstation::ReleaseBuilderPage do |page|
    unless page.no_results_found
      filter_by = filter_type.to_snake_case
      page.clear_all_filters_for(filter_by)
      @filter_values = []
      selected_filters.split(", ").each do |filter|
        # First gsub strips out parentheses
        # Second gsub replaces forward slashes and spaces with underscores
        # Example: 'Music (Audio/Video)' becomes 'music_audio_video'
        filter_text = filter.downcase.gsub(%r{[\/ ]}, "_")
        @filter_values.push page.check_filter_and_get_value(filter_text)
      end
      page.filter_link_element.parent.click
    end
  end
end

And(/^I should see the search results filtered by (.*?)$/) do |filter_type|
  on Workstation::ReleaseBuilderPage do |page|
    unless page.no_results_found
      filter_by = filter_type.to_snake_case
      if filter_by == "status"
        query = "filterType"
      elsif filter_by == "product_type"
        query = "productType"
      end
      filters_in_url = page.query_value_from_current_url(query).split(",")
      puts "Filters in URL: #{filters_in_url}"
      puts "Selected filters: #{@filter_values}"
      expect(filters_in_url).to match_array(@filter_values)
    end
  end
end
