Then(/^a music video release is successfully created in Workstation$/) do
  on(Workstation::ViewReleasePage) do |page|
    expect(page.release_basics_title).to eql @release_data[:release_name]
    @release_data[:upc] = page.assigned_upc
    # On the new grid, sometimes the next scenario will fail because it is
    # unable to navigate away from the current page. There is no explicit
    # reason for this happening, but this sleep seems to fix it.
    sleep 5
  end
end

And(/^I should see the correct product status$/) do
  release_status = "Release Status: A few steps to go and your release will be ready!"
  on(Workstation::ViewReleasePage) do |page|
    expect(page.release_status_element.text).to eql release_status
  end
end

# Currently used in:
#   music_video_release_builder.feature
When(/^I click Create Release$/) do
  on(Workstation::CreateMusicVideoModal) do |page|
    page.create_release
    page.saving_release_modal_element.element.wait_while(timeout: 45, &:present?)
  end
end

Given(/^a delivered release with copyable assets$/) do
  @copyable_release_id = "470042"
  visit(Workstation::ViewReleasePage, using_params: { queries: { "release_id" => @copyable_release_id } })
end

When(/^I copy the release in Workstation$/) do
  on(Workstation::ViewReleasePage) do |page|
    page.copy_release_element.click
    page.copy_release_button_element.element.wait_until(&:present?)
    @version_name = "Watir Audio Copy #{Time.stamp}"
    page.new_version_name = @version_name
    page.copy_release_button
    page.wait_while_copying_element.element.wait_while(&:present?)
  end
end

Then(/^I expect a new release$/) do
  on(Workstation::ViewReleasePage) do |page|
    page.wait_until { page.query_value_from_current_url("release_id") != @copyable_release_id }
    @copied_release_id = page.query_value_from_current_url("release_id")
    @audio_release_upc = page.assigned_upc
    puts "Copied release ID: #{@copied_release_id}\nCopied release UPC: #{@audio_release_upc}"
    page.tracks_loading_element.element.wait_while(&:present?)
    expect(page.release_basics_release_version).to eq @version_name
    while_encoding = proc do |exception, try|
      puts "#{exception.class}: '#{exception.message}' - Retries: #{try}"
      puts "Tracks left to encode: #{page.encoding_audio_elements.size}"
    end
    Retriable.retriable(
      on: Watir::Wait::TimeoutError, tries: 5, on_retry: while_encoding
    ) { page.wait_until(60) { page.encoding_audio_elements.none? } }
    Retriable.retriable(on: Watir::Wait::TimeoutError, tries: 5) do
      page.wait_until(60) do
        artwork_src = page.album_cover_element.element.src
        File.basename(URI.parse(artwork_src).path) != "noArtwork.png"
      end
    end
    page.wait_until { page.artwork_complete? }
  end
end

When(/^I enter all required data for release submission$/) do
  on(Workstation::ViewReleasePage) do |page|
    page.edit_track_information
    Retriable.retriable on: Watir::Wait::TimeoutError, tries: 5 do
      page.wait_until(60) { page.edit_track_elements.any? }
    end
  end
  on(Workstation::EditTrackDetailsModal) do |page|
    page.edit_track_language = "English"
    page.apply_language_to_all
    page.wait_for_loader
    page.save_edited_tracks
  end
end

Then(/^the release should be submittable$/) do
  on(Workstation::ViewReleasePage) do |page|
    page.wait_until(60) do
      !page.submit_release_element.when_present.element.attribute_value("class").include? "disabled"
    end
    # Sometimes clicking the submit release button doesn't work right away.
    # TODO: find a better way to do this.
    sleep 1
    page.submit_release
    page.loader_wait(
      element: page.loading_confirm_release_modal_element,
      timeout: 120
    )
    page.confirm_audio_submission_element.when_present.click
    page.wait_until(120) { !page.save_track_overlay_message? }
    page.wait_until { !page.current_url.include? "releasebuilder" }
  end
end

When(/^I view the release through the release builder$/) do
  @upc = on(Project::DigitalProductOverviewPage).upc_element.when_present.text
end

When(/^I checkout and submit the release for approval$/) do
  step("I look for the release in Release Approval")
  step("I check out the release")
  step("I see the new artwork on the release approval page")
  step("I approve the release")
  step("I confirm that the release is not for distribution")
  step("I wait for the approval to submit")
end

When(/^I look for the (product|release) in Release Approval$/) do |_|
  visit(OA::CheckOutReleasePage) do |page|
    page.populate_search_with_upc(@upc)
    # sometimes the release isn't fully submitted before we get to this page
    Retriable.retriable(
      on: [RSpec::Expectations::ExpectationNotMetError, Watir::Wait::TimeoutError],
      tries: 3
    ) do
      page.submit
      expect(page.results_element.text).to include @upc
    end
  end
end
