When(/^I go to the physical product artwork section$/) do
  on(Project::PhysicalProductDetailsPage) do |page|
    @browser.alert.ok if @browser.alert.exists?
    page.navigate_to_artwork_element.when_present
    sleep 2 # no idea why this is necessary
    page.navigate_to_artwork_element.click
  end
  on(Project::ProductArtworkPage).artwork_dropzone_element.when_present
end

When(/^I upload valid artwork$/) do
  product_data_helper = DataHelpers::Product.new(label_type: "label")
  on(Project::ProductArtworkPage) do |page|
    if page.upload_success?
      current_artwork_path = FileSystemHelpers::Downloader.download(
        page.current_artwork_url
      ).first
      @uploaded_image = product_data_helper.new_artwork(current_artwork_path)
    else
      @uploaded_image = Support::Helpers::Artwork.new("flaming_t")
    end
    page.upload_artwork @uploaded_image.original
    page.wait_for_success
  end
end

When(/^I upload invalid artwork$/) do
  file = File.join(Support::Paths.assets, "artwork", "invalid_artwork.jpg")
  on(Project::ProductArtworkPage) do |page|
    page.upload_artwork file
  end
end

Then(/^I should see an error message that the artwork is invalid$/) do
  on(Project::ProductArtworkPage) do |page|
    eventually(timeout: 90) { expect(page.invalid_image_error?).to be true }
  end
end

Then(/^I should be redirected to product review page$/) do
  eventually(timeout: 30, interval: 2) do
    expect(@browser.url).to eql "#{DOMAINS[:project]}/project/#{@project_id}/product/#{@product_id}"
    on(Project::PhysicalProductCompletedPage) do |page|
      expect(page.completed_message)
        .to eql "Your product is complete and needs no further action."
    end
  end
end

Then(/^I see the new artwork on the (.*) page$/) do |page_name|
  current_image_url = case page_name
                      when "physical product review"
                        on(Project::PhysicalProductReviewPage).artwork_element.element.src
                      when "digital product overview"
                        on(Project::DigitalProductOverviewPage).artwork_url
                      when "release approval"
                        on(OA::ReleaseApprovalPage).artwork_image_element.element.src
                      else
                        fail "unknown page: '#{page_name}'!"
                      end
  current_image_path = FileSystemHelpers::Downloader.download(current_image_url).first
  actual_image = Support::Helpers::Image.new(current_image_path)
  if @uploaded_image
    actual_image.should_match(@uploaded_image.large_cover)
  else
    actual_image.should_match(Support::Helpers::Artwork.new("flaming_t").large_cover)
  end
end

When(/^I wait for the artwork to load on the physical product review page$/) do
  # need to wait for artwork to encode before it appears on the review page
  on(Project::PhysicalProductReviewPage) do |page|
    page_refresh = proc do |exception, try|
      puts "#{exception.class}: '#{exception.message}' - Retry attempt: #{try}"
      page.refresh(@session_token)
    end
    Retriable.retriable(
      on: RSpec::Expectations::ExpectationNotMetError, tries: 5, on_retry: page_refresh, base_interval: 10
    ) do
      page.artwork_header_element.when_present
      page.artwork_header_element.scroll.to
      eventually(timeout: 5) { expect(page.artwork?).to be true }
    end
  end
end

When(/^I go to edit artwork section$/) do
  on(Project::PhysicalProductCompletedPage) do |page|
    @browser.alert.ok if @browser.alert.exists?
    page.edit_artwork_element.when_present
    Retriable.retriable(on: Selenium::WebDriver::Error::UnknownError, tries: 5) do
      page.wait_until { expect(page.physical_image_element.attribute_value("src").empty?).to be false }
      page.edit_artwork
    end
  end
  on(Project::ProductArtworkPage).wait_for_replace_artwork_button
end

When(/^I click on the physical product territories section$/) do
  on(Project::PhysicalProductCompletedPage) do |page|
    page.navigate_to_territories_element.when_present.click
  end
end
