Then(/^I should see a validation message for missing track fields$/) do
  on(Project::DigitalProductTracksPage) do |page|
    expect(page.tracklist_alert_element.text).to include "Missing Information"
  end
end

And(/^I click ValidateProduct button$/) do
  on(Project::DigitalProductTracksPage) do |page|
    page.validate_product_element.click
  end
end

Then(/^I should see an icon for a track because not all fields are filled$/) do
  on(Project::DigitalProductTracksPage) do |page|
    eventually(timeout: 5) do
      expect(page.tracklist_alert_triangle_elements.count).to eql 1
    end
  end
end

And(/^track (\d+) has no metadata$/) do |track|
  on(Project::DigitalProductTracksPage) do |page|
    page.wait_until { page.file_field_elements.any? }
    page.track_elements[track.to_i - 1].element.click
    page.wait_until { page.track_header.include? "Track #{track}" }
    page.clear_track_metadata
  end
end

When(/^I fill in all the required track builder fields$/) do
  on(Project::DigitalProductTracksPage) do |page|
    page.wait_until { page.file_field_elements.any? }
    @track_data = DataHelpers::TrackBuilderData.track_builder_data
    page.validate_product
    eventually do
      expect(page.tracklist_alert_triangle_elements.count).to be > 0
      @alert_triangles_count = page.tracklist_alert_triangle_elements.size
    end

    page.track_elements.first.click
    page.fill_neccessary_track_data(@track_data)
  end
end

Then(/^I should not see the validation warning for that track$/) do
  on(Project::DigitalProductTracksPage) do |page|
    page.validate_product
    eventually do
      expect(page.tracklist_alert_triangle_elements.size).to eql(@alert_triangles_count - 1)
      expect(page.track_elements.first.svgs.last.attribute_value("class")).to eql "Icons-complete-checkmark"
    end
  end
end

When(/^I delete all optional track contributors$/) do
  on(Project::DigitalProductTracksPage) do |page|
    page.open_performers_modal
    page.delete_all_contributors_on_tab(
      page.studio_personnel_tab_element, page.studio_personnel_list_element
    )
    page.delete_all_contributors_on_tab(
      page.label_personnel_tab_element, page.label_personnel_list_element
    )
    page.delete_all_contributors_on_tab(
      page.compositional_tab_element, page.compositional_contributor_list_element
    )
    page.delete_all_contributors_on_tab(page.performers_tab_element, page.performers_list_element)
  end
end

When(/^I save my track( and continue to the next step)?$/) do |next_step|
  on(Project::DigitalProductTracksPage) do |page|
    page.save
    page.wait_until { page.current_product_step_element != page.tracks_step_element }
  end
  if next_step.nil? == false
    on(Project::DigitalProductPricingPage) do |page|
      page.wait_until { page.add_individual_track_price_element.present? }
    end
  end
end

Then(/^only the primary performer is left$/) do
  on(Project::DigitalProductTracksPage) do |page|
    expect(page.row_elements(class: "TrackParticipantRow-performers").size).to eql 1
  end
end

When(/^I add a (Primary|Featured|Non-Featured) performer with the (.*?) role$/) do |type, role|
  on(Project::DigitalProductTracksPage) do |page|
    page.open_performers_modal
    page.add_single_track_performer(type, role)
  end
end

When(/^I add studio personnel with (.*?) role$/) do |role|
  on(Project::DigitalProductTracksPage) do |page|
    @studio_personnel = page.add_studio_personnel(role)
  end
end

When(/^I add label personnel with (.*?) role$/) do |role|
  on(Project::DigitalProductTracksPage) do |page|
    @label_personnel = page.add_label_personnel(role)
  end
end

When(/^I add a compositional contributor with (.*?) role$/) do |role|
  on(Project::DigitalProductTracksPage) do |page|
    @compositional_contributor = page.add_compositional_contributor(role)
  end
end

When(/^I add lyrics to my track and save$/) do
  on(Project::DigitalProductTracksPage) do |page|
    page.wait_until { page.track_elements.any? }
    page.track_elements.first.click
    page.wait_until { page.file_field_elements.any? }
    @lyrics = "My lyrics #{Time.stamp}"
    # Retries typing since Chromedriver seems to be having problems with this text area
    Retriable.retriable(on: RSpec::Expectations::ExpectationNotMetError, tries: 3) do
      page.lyrics_element.clear
      page.lyrics = @lyrics
      eventually(timeout: 2) { expect(page.lyrics).to eq @lyrics }
    end
    page.save
    page.wait_until { page.current_product_step_element != page.tracks_step_element }
  end
end

And(/^I save all the performers that I added$/) do
  @performers = {}
  on(Project::DigitalProductTracksPage) do |page|
    page.performers_tab_element.click
    page.performers_list_element.row_elements[1..-1].each_with_index do |each_performer, index|
      performer = "performer_#{(index + 1)}"
      performer_details = {}
      performer_details["type"] = each_performer.tds[1].text
      performer_details["birth_name"] = each_performer.tds[2].text_field(id: "product-name").value
      performer_details["main_role"] = each_performer.tds[3].text
      @performers[performer] = performer_details
    end
    @performers_size = page.performers_list_element.rows - 1
    page.done
    page.wait_until { !page.performers_list? }
    current_url = page.url
    page.digital_product_next
    page.wait_until { @browser.url.include? "pricing" }
    @browser.goto current_url
  end
end

Then(/^I can see the performers that I added in the performers section$/) do
  on(Project::DigitalProductTracksPage) do |page|
    eventually do
      expect(page.div_element(
        class: "TrackParticipants-list-type-subsection"
      ).div_elements(class: "TrackParticipants-list-participant-item").size).to eql @performers_size
    end
    sleep 5
    (1..@performers_size).each do |index|
      performer_row = page.div_elements(class: "TrackParticipants-list-participant-item")[(index - 1)]
      performer_name = performer_row.text.split("\n").first
      performer_role = performer_row.text.split("\n").last
      expect(performer_name).to eql @performers["performer_#{index}"]["birth_name"]
      expect(performer_role).to eql @performers["performer_#{index}"]["main_role"]
    end
  end
end

Then(/^I can see the studio personnel I added in the studio personnel section$/) do
  on(Project::DigitalProductTracksPage) do |page|
    expect(page.studio_personnel_name_element.text).to eql @studio_personnel[:name]
    expect(page.studio_personnel_role_element.text).to eql @studio_personnel[:role]
  end
end

Then(/^I can see the label personnel I added in the label personnel section$/) do
  on(Project::DigitalProductTracksPage) do |page|
    expect(page.label_personnel_name_element.text).to eql @label_personnel[:name]
    expect(page.label_personnel_role_element.text).to eql @label_personnel[:role]
  end
end

Then(/^I can see the compositional contributor I added in the compositional contributor section$/) do
  on(Project::DigitalProductTracksPage) do |page|
    expect(page.compositional_name_element.text).to eql @compositional_contributor[:name]
    expect(page.compositional_role_element.text).to eql @compositional_contributor[:role]
  end
end

Then(/^I should see my expected lyrics on the track$/) do
  on(Project::DigitalProductTracksPage) do |page|
    page.wait_until { page.track_elements.any? }
    page.track_elements.first.click
    page.wait_until { page.file_field_elements.any? }
    # lyrics can take a moment to populate
    eventually(timeout: 10) do
      expect(page.lyrics).to eql @lyrics
    end
  end
end

Given(/^track (\d+)? has no lyrics$/) do |track_id|
  session_token = Support::Services::GrassAuth.instance.workstation_session_token("label_7123")
  Support::Services::OwsTrack.delete_lyrics(track_id, session_token)
end
