When(/^I populate the required digital pricing with (Immediate|Specific Date|No Pre-order)$/) do |type|
  @product_pricing = DataHelpers::DigitalPricing.new(type)
  on(Project::DigitalProductPricingPage).populate_required_fields(@product_pricing.data)
  Support::Helpers::ScenarioVariables.add_scenario_variable("Product pricing: ", @product_pricing.data)
end

When(/^I add individual track price for track (.*)$/) do |track|
  on(Project::DigitalProductPricingPage).populate_individual_track(track)
end

When(/^I submit the digital pricing form$/) do
  on(Project::DigitalProductPricingPage).save
  on(Project::DigitalProductBasePage) do |page|
    page.wait_until { page.current_product_step_element != page.scheduling_and_pricing_step_element }
    page.pricing_checkmark_element.wait_until(&:present?)
  end
  # otherwise overview step click doesn't register for some reason
  sleep 1
end

When(/^I specify a sales date (of today|in the future)$/) do |date_choice|
  date = date_choice == "of today" ? Date.today.to_s : (Date.today + 1).to_s
  # patch to clear out date field and type
  on(Project::DigitalProductPricingPage) do |page|
    @browser.alert.ok if @browser.alert.exists?
    page.sales_date_element.clear_text_and_type date
    @browser.send_keys :enter
  end
  # maybe switch back to this when chromedriver is fixed
  # on(Project::DigitalProductPricingPage).sales_date_element.clear
  # on(Project::DigitalProductPricingPage).sales_date = date
end

Then(/^I see the correct pricing data on the digital product overview page$/) do
  pricing_values = on(Project::DigitalProductOverviewPage).pricing_values
  expect(pricing_values).to eql @product_pricing.data
end

Then(/^I see the price for the individual track$/) do
  individual_track_price = on(Project::DigitalProductOverviewPage).individual_track_pricing
  expect(individual_track_price).not_to be_empty
end

Then(/^I see the individual track (.*)$/) do |track|
  individual_track = on(Project::DigitalProductOverviewPage).individual_track
  expect(individual_track).to eql track
end

Given(/^I have a digital product for Instant Grats testing$/) do
  @product_id = 2_131_194
end

Given(/^I have a digital product for Instant Grats testing with a sales date in the past$/) do
  @product_id = 2_134_789
end

When(/^I create a single copy from my instant grat$/) do
  on(Project::DigitalProductPricingPage) do |page|
    page.immediate_preorder_element.when_present
    page.immediate_preorder
    page.add_instant_grat(@track_data[:track_name])
    pre_copy_links_count = page.navigation_link_elements.count
    page.grats_create_single
    # Grats create single is essentially a stripped down copy product modal
    on(Project::CopyDigitalProductModal) do |modal|
      modal.product_code = Time.stamp.slice(0..14)
      modal.create_copy
      modal.loader_element.wait_until(&:present?)
      modal.loader_element.wait_while(&:present?)
    end
    page.wait_until { page.navigation_link_elements.count == pre_copy_links_count + 1 }
  end
end

Then(/^I should be able to add Instant Grats for (Immediate|Specific) Date$/) do |date|
  on(Project::DigitalProductPricingPage) do |page|
    @browser.alert.ok if @browser.alert.exists?
    page.immediate_preorder_element.when_present

    # delete IGs from previous runs, if any
    page.delete_instant_grat

    two_days_from_today = (DateTime.now + 2).strftime("%F")

    # patch to clear out date field and type
    page.sales_date_element.clear_text_and_type two_days_from_today
    # maybe switch back to this when chromedriver is fixed
    # page.sales_date = two_days_from_today
    page.sales_date_element.append "\n"
    # patch to clear out date field and type
    page.release_date_element.clear_text_and_type two_days_from_today
    # maybe switch back to this when chromedriver is fixed
    # page.release_date = two_days_from_today
    page.release_date_element.append "\n"

    case date
    when "Immediate"
      page.immediate_preorder
    when "Specific"
      page.specific_date_preorder
    end

    @track_name = "abc_1"
    @start_date = (DateTime.now + 1).strftime("%F")

    page.add_instant_grat(@track_name, @start_date)
    page.check_ig_present
  end
end

Then(/^I shouldn't be able to add Instant Grats without a Pre-Order Date$/) do
  on(Project::DigitalProductPricingPage) do |page|
    @browser.alert.ok if @browser.alert.exists?
    page.immediate_preorder_element.when_present

    # delete IGs from previous runs, if any
    page.delete_instant_grat
    page.no_preorder
    expect(page.add_instant_grats_btn_element.element.present?).to be false
  end
end

And(/^Instant Grat should be persistent upon save$/) do
  on(Project::DigitalProductPricingPage) do |page|
    page.save
    page.loading_dots_element.when_not_present
    step "I am on the Project::DigitalProductPricingPage for the product"
    page.immediate_preorder_element.when_present

    page.check_ig_present

    expect(page.ig_track_dropdown_element.text).to eql @track_name
    expect(page.start_date_element.value).to eql @start_date
  end
end

And(/^I add Instant Grats for the same track but different date$/) do
  step "I should be able to add Instant Grats for Immediate Date"

  on(Project::DigitalProductPricingPage) do |page|
    @track_name = "abc_1"
    @start_date = (DateTime.now + 2).strftime("%F")

    page.add_instant_grats_btn
    page.select_ig_track_dropdown_2(@track_name)
    page.start_date_2_element.send_keys(@start_date)

    page.save
  end
end

Then(/^validation error should be obtained$/) do
  on(Project::DigitalProductPricingPage) do |page|
    expect(page.error_message_elements.size).to eql 2
    page.error_message_elements.each do |error|
      expect(error.text).to eql "Instant Grat for this retailer and track already exists"
    end
  end
end

Then(/^I should(| not) see the instant grats section$/) do |expect_present|
  on(Project::DigitalProductPricingPage) do |page|
    @browser.alert.ok if @browser.alert.exists?
    page.release_date_element.when_present
    page.loading_dots_element.when_not_present
    expect(page.ig_section?).to be expect_present == "" ? true : false
  end
end

Then(/^I should see that preorder buttons are (disabled|enabled)$/) do |expect_enabled|
  on(Project::DigitalProductPricingPage) do |page|
    expect(page.immediate_preorder_element.disabled?).to be expect_enabled == "disabled" ? true : false
    expect(page.no_preorder_element.disabled?).to be expect_enabled == "disabled" ? true : false
    expect(page.specific_date_preorder_element.disabled?).to be expect_enabled == "disabled" ? true : false
  end
end

Then(/^I should(| not) see the preorder button disabled text$/) do |expect_present|
  expect_text = expect_present == "" ? true : false
  expect(on(Project::DigitalProductPricingPage).preorder_buttons_disabled_text?).to be expect_text
end

And(/^I add an Instant Grat$/) do
  step "I should be able to add Instant Grats for Immediate Date"
  step "Instant Grat should be persistent upon save"
end

Then(/^I should be able to delete an Instant Grat$/) do
  on(Project::DigitalProductPricingPage) do |page|
    page.delete_instant_grat_element.when_present
    page.delete_instant_grat
    expect(page.delete_instant_grat_element.exists?).to be false
  end
end
