Given(/^I have an in-content physical product$/) do
  @project_id = 3_959_479
  @product_id = 2_358_044
  Support::Helpers::ScenarioVariables.add_scenario_variable("Project id: ", @project_id)
  Support::Helpers::ScenarioVariables.add_scenario_variable("Product id: ", @product_id)
end

When(/^I copy the (|in-content )physical product$/) do |in_content|
  Support::Helpers::ScenarioVariables.add_scenario_variable("Product data: ", @product_data.data)
  @product_data.replace_copy_fields
  @product_data.replace_pre_existing_fields if in_content.include? "in-content"
  on(Project::PhysicalProductDetailsPage) do |page|
    Retriable.retriable(on: Watir::Exception::UnknownObjectException, tries: 3) do
      page.active_product_more_actions_element.when_present.click
      page.copy_product_option_element.click
    end

    pre_copy_links_count = page.navigation_link_elements.count
    on(Project::CopyPhysicalProductModal) do |modal|
      modal.populate_create_product_modal(@product_data.data)
      modal.submit
      modal.loader_element.element.wait_until(&:present?)
      modal.loader_element.element.wait_while(&:present?)
    end
    # wait until our new product is present and active
    page.wait_until { page.navigation_link_elements.count == pre_copy_links_count + 1 }
    page.wait_until do
      page.navigation_link_elements.last.attribute_value("class").include? "Opm-navigation-selected"
    end
  end
end

When(/^I copy the physical product to digital$/) do
  @product_data.replace_copy_fields
  on(Project::PhysicalProductDetailsPage) do |page|
    page.product_more_actions_element.when_present.click
    page.copy_product_option_element.click
  end
  on(Project::CopyPhysicalProductModal) do |page|
    page.digital
    page.product_name = @product_data.data[:product_name]
    page.product_version = @product_data.data[:product_version]
    page.version_notes = @product_data.data[:version_notes]
    page.format = @product_data.data[:format]
    page.create_copy
    page.loader_to_dig_element.element.wait_until(&:present?)
    page.loader_to_dig_element.element.wait_while(&:present?)
  end
end

When(/^I copy the digital product$/) do
  on(Project::DigitalProductBasePage) do |page|
    page.product_more_actions_element.when_present.click
    page.copy_product_option_element.click
  end
  on(Project::CopyDigitalProductModal) do |modal|
    modal.product_name = @product_data.data[:product_name]
    modal.product_version = @product_data.data[:product_version]
    modal.version_notes = @product_data.data[:version_notes]
    modal.product_code = Time.stamp.slice(0..14)
    modal.format = "Full Length"
    modal.create_copy
    modal.loader_element.wait_until(&:present?)
    modal.loader_element.wait_while(&:present?)
  end
  on(Project::DigitalProductOverviewPage) do |page|
    page.wait_until { page.product_name_element.text == @product_data.data[:product_name] }
    @upc = page.upc_element.text
    @product_id = page.product_id_from_url
  end
end

When(/^I navigate to my new single's track/) do
  on(Project::ProjectDetailsPage) do |page|
    page.navigation_link_elements.find { |product| product.text.include? "Single" }.click
    page.save_changes
    begin
      page.loading_dots_element.when_present(1)
    rescue Watir::Wait::TimeoutError
      puts "Loading dots were not detected."
    end
    page.wait_until { page.active_digital_product.include? "Single" }
    page.loading_dots_element.when_not_present
    page.tracks_step
  end
  on(Project::DigitalProductTracksPage) do |page|
    page.wait_until { page.track_elements.any? }
    page.track_elements.first.click
  end
end

Then(/^my new track values should match the source$/) do
  on(Project::DigitalProductTracksPage) do |page|
    # skip checking version - it does not copy over
    page.track_values.except(:version).each do |key|
      expect(page.track_values[key[0]]).to eql @track_data[key[0]]
    end
  end
end

Then(/^I see the correct basics data on my copied product$/) do
  release_basics = on(Project::DigitalProductOverviewPage).release_basics_values(
    only_for: @product_data.fields
  )
  release_basics.delete(:product_code)
  release_basics.delete(:primary_artists)
  release_basics.delete(:featuring_artists)
  @product_data.data.delete(:product_code)
  @product_data.data.delete(:primary_artists)
  @product_data.data.delete(:featuring_artists)
  expect(release_basics).to match @product_data.data
end

Then(/^I see the correct basics data on my copied product from a physical product$/) do
  eventually(timeout: 5) do
    release_basics = on(Project::DigitalProductOverviewPage).release_basics_values(
      only_for: @product_data.copy_to_digital_fields.keys
    )
    release_basics.delete(:product_code)
    @product_data.data.delete(:product_code)
    expect(release_basics).to match @product_data.copy_to_digital_fields
  end
end
