Given(/^the product does not have an associated Promo Player$/) do
  Support::Services::OwsPromoPlayer.delete_players(@product_id)
end

Given(/^I have an existing digital product with artwork and tracks on QA$/) do
  @project_id = 3_848_088
  @product_id = 2_205_277
  Support::Helpers::ScenarioVariables.add_scenario_variable("Project id: ", @project_id)
  Support::Helpers::ScenarioVariables.add_scenario_variable("Product id: ", @product_id)
end

When(/^I (enable|disable) the product's Promo Player$/) do |mode|
  on(Project::DigitalProductOverviewPage) do |page|
    page.promo_container_element.wait_until(&:present?)
    if mode == "enable"
      page.enable_button_element.click unless page.enabled_message_element.exists?
    else
      page.disable_button_element.click unless page.disabled_message_element.exists?
    end
  end
end

When(/^I (enable|disable) the product's Promo Player using the microservice$/) do |mode|
  flag = if mode == "enable"
           true
         else
           false
         end

  players =  JSON.parse(Support::Services::OwsPromoPlayer.get_players(@product_id).body)
  players =  players["items"]
  players.each do |item|
    response = Support::Services::OwsPromoPlayer.update_player(
      @users.workstation_user_data[:id],
      @product_id,
      item["promo_player_id"],
      active: flag
    )
    puts JSON.parse(response.body)
  end
end

When(/^I select the (.*) Expiration Mode$/) do |mode|
  on(Project::DigitalProductOverviewPage) do |page|
    page.promo_container_element.wait_until(&:present?)
    if mode == "on_release"
      page.select_expiration_mode_on_release
    else
      page.select_expiration_mode_never
    end
  end
end

When(/^I save the Promo Player$/) do
  on(Project::DigitalProductOverviewPage) do |page|
    page.save
    page.wait_until { page.current_product_step_element != page.projections_step_element }
  end
end

When(/^I set the product's release date in the (past|future)$/) do |time|
  time_step = if time == "past"
                -10
              else
                10
              end
  date_to_use = (Date.today + time_step).to_s
  step "I am on the Project::DigitalProductPricingPage for the product"
  on(Project::DigitalProductPricingPage) do |page|
    page.release_date_element.wait_until(&:present?)
    page.release_date_element.clear_text_and_type date_to_use
    page.save
    page.wait_until { page.current_product_step_element != page.scheduling_and_pricing_step_element }
  end
end

Then(/^the Promo Player Builder Page shows the Promo Player is (enabled|disabled)$/) do |mode|
  on(Project::DigitalProductOverviewPage) do |page|
    if mode == "enabled"
      page.enabled_message_element.wait_until(&:present?)
    else
      page.disabled_message_element.wait_until(&:present?)
    end
  end
end

Then(/^the linked Promo Player (.*)$/) do |statement|
  @promo_player_code = on(Project::DigitalProductOverviewPage).promo_player_code
  step "the stored Promo Player #{statement}"
end

Then(/^the stored Promo Player matches the page settings$/) do
  on(Project::DigitalProductOverviewPage) do |page|
    eventually(timeout: 5) do
      resp = Support::Services::OwsPromoPlayer.get_player_by_code(@promo_player_code)
      expect(resp["product_id"]).to eq(@product_id)
      expect(resp["expiration_mode"]).to eq(if page.expiration_mode_on_release_selected?
                                              "on_product_release"
                                            elsif page.expiration_mode_never_selected?
                                              "none"
                                            end)
      expect(resp["code"]).to eq(@promo_player_code)
      expect(resp["active"]).to be(true)
    end
  end
end

Then(/^the stored Promo Player is (enabled|disabled)$/) do |mode|
  eventually(timeout: 5) do
    resp = Support::Services::OwsPromoPlayer.get_player_by_code(@promo_player_code)
    expect(resp["active"]).to be(mode == "enabled")
  end
end

Then(/^the stored Promo Player matches the current link$/) do
  expect(@promo_player_code).to eq(on(Project::DigitalProductOverviewPage).promo_player_code)
end

Then(/^the stored Promo Player leads to an? (invalid|valid) page$/) do |type|
  visit_and_dismiss_alerts(
    PromoPlayer::PlayerPage,
    using_params: {
      code: @promo_player_code,
      queries: @url_queries
    }
  )
  on(PromoPlayer::PlayerPage) do |page|
    if type == "valid"
      page.player_element.wait_until(&:present?)
    else
      page.not_found_element.wait_until(&:present?)
    end
  end
end

Then(/^the Promo Player should (not)? ?be available$/) do |available|
  on(Project::DigitalProductOverviewPage) do |page|
    element = if available == "not"
                page.unavailable_message_element
              else
                step "I disable the product's Promo Player using the microservice"
                page.disabled_message_element
              end
    element.wait_until(&:present?)
  end
end

Then(/^the Promo Player Builder Page shows no url$/) do
  on(Project::DigitalProductOverviewPage) do |page|
    page.disabled_message_element.wait_until(&:present?)
  end
end
