When(/^I initiate a response for the first( \d+)? tracks? with territory conflicts$/) do |num_tracks|
  on(ConflictManager::NewConflictsPage) do |page|
    page.wait_until { page.conflicts? }
    num_tracks.nil? ? (num_tracks = 1) : (num_tracks = num_tracks.strip.to_i)
    @conflicts = page.conflicts_element.row_elements[1..num_tracks].each_with_object([]) do |element, result|
      element.div_element(class: "checkbox").click if num_tracks > 1
      result << {
        "isrc" => element.paragraph_element(class: "ConflictRow-small-label").text,
        "conflicts" => element.cell_element(class: "ConflictWith-cell").text.split("\n").last[/\d+/],
        "conflict_with" => element.link_element(class: "NewConflictRow-territories-link").text
      }
    end
    if num_tracks == 1
      page.conflicts_element[num_tracks].hover
      page.conflicts_element[num_tracks].button_element.when_present.click
    else
      page.wait_until { page.bulk_respond_to_element.text.include? num_tracks.to_s }
      page.bulk_respond_to
    end
  end
end

When(/^I initiate a response for a track with multiple territory conflicts$/) do
  on(ConflictManager::NewConflictsPage) do |page|
    page.wait_until { page.conflicts? }
    # Searches for a track that has a conflict with multiple territories
    track = page.conflicts_element.row_elements[1..-1].find do |x|
      x.text.include? "Territories"
    end
    @conflicts = []
    @conflicts << {
      "isrc" => track.paragraph_element(class: "ConflictRow-small-label").text,
      "conflicts" => track.cell_element(class: "ConflictWith-cell").text.split("\n").last[/\d+/],
      "conflict_with" => track.link_element(class: "NewConflictRow-territories-link").text
    }
    track.hover
    track.button_element.when_present.click
  end
end

When(/^I claim to have exclusive rights for (.*?) of the territories$/) do |exclusivity|
  on(ConflictManager::ConflictResponsePage) do |page|
    page.wait_until { page.exclusivity? }
    page.select_exclusivity exclusivity
    page.next
    case exclusivity
    when "all"
      page.wait_until { page.assert_reason? }
      page.assert_territories
      @conflicts.each { |x| x.merge!("action" => "Assert ") }
    when "some"
      page.wait_until { page.continent_elements.any? }
      page.claim_some_territories
    when "none"
      page.wait_until { page.release_reason? }
      page.release_territories
      @conflicts.each { |x| x.merge!("action" => "Release ") }
    end
    page.wait_until { page.action_summary? }
    if exclusivity == "some"
      @released_territories = page.release_summary[/\d+/].to_i if page.release_summary?
      @asserted_territories = page.assert_summary[/\d+/].to_i if page.assert_summary?
    end
    page.next
  end
  on(ConflictManager::NewConflictsPage).conflicts_element.wait_until(&:present?)
end

Then(/^I should see my response in the response history$/) do
  visit(ConflictManager::ResponseHistoryPage) do |page|
    page.wait_until { page.response_history? }
    page.sort_by_date_responded("newest_first")

    @conflicts.each do |conflict|
      conflict_response = page.response_history_element.find_index do |row|
        if row.ps.any?
          row.p(class: "ConflictRow-small-label").text == conflict["isrc"] &&
            row.cell(class: "ConflictWith-cell").text == conflict["conflict_with"]
        end
      end
      if @released_territories.nil?
        page.match_bulk_responses(conflict_response, conflict)
      else
        page.match_conflict_responses(conflict_response, @released_territories, @asserted_territories)
      end
    end
  end
end

Given(/^I have data for an existing conflict$/) do
  on(ConflictManager::NewConflictsPage) do |page|
    page.goto unless page.search_input?
    page.wait_until { page.search_input? }
    page.reset_search_input if page.no_tracks?
    if ConflictManager::NewConflictsPage.searchable_conflict.nil?
      last_row = page.row_elements.last
      ConflictManager::NewConflictsPage.searchable_conflict = {
        "track" => last_row.p.text,
        "isrc" => last_row.p(class: "ConflictRow-small-label").text,
        "artist" => last_row[2].p.text,
        "product" => last_row[3].p.text,
        "upc" => last_row[3].ps.last.text,
        "conflicting_rightsholder" => last_row.link_element.text
      }
      puts ConflictManager::NewConflictsPage.searchable_conflict
    end
  end
end

When(/^I search for an existing conflict by (.*?)$/) do |search_type|
  @search_entry = ConflictManager::NewConflictsPage.searchable_conflict[search_type]
  puts "Searching for #{search_type}: #{@search_entry}"
  on(ConflictManager::NewConflictsPage) do |page|
    page.clear_filter
    page.throttled_input(page.search_input_element, @search_entry, 0.5, false)
    page.wait_for_results
  end
end

Then(/^I am able to see it in the search results$/) do
  on(ConflictManager::NewConflictsPage) do |page|
    expect(page.result_in_table?(@search_entry)).to be true
  end
end
