When(/^I create a new project$/) do
  on(ReactWorkstation::ReactHomePage) do |page|
    page.create_new
  end
end

When(/^I begin to create a new project$/) do
  on(ReactWorkstation::ReactHomePage) do |page|
    page.create_new
    page.new_music_project_element.click
  end
end

Then(/^I am redirected to the Project::CreateProjectPage$/) do
  on(Project::CreateProjectPage) do |page|
    eventually(timeout: 10) { expect(page.project_name?).to be true }
    expect(@browser.url).to include "/project/new-create"
  end
end

Given(/^I have an existing empty project$/) do
  @project_id = 3_872_829
end

Given(/^I am on the (\w+::\w+) for the product( \d+)?$/) do |class_as_string, product_id|
  @product_id = product_id.strip unless product_id.nil?
  if ENV["DOMAIN_PROFILE"] != "production"
    query = "SELECT project_id FROM releases WHERE release_id = #{@product_id};"
    upc_query = "SELECT upc FROM releases WHERE release_id = #{@product_id};"
    display_upc_query = "SELECT display_upc FROM releases WHERE release_id = #{@product_id};"
    @project_display_upc = Support::DbClient.query_art_relations(display_upc_query).first["display_upc"]
    @project_id = Support::DbClient.query_art_relations(query).first["project_id"]
    @project_upc = Support::DbClient.query_art_relations(upc_query).first["upc"]
  end
  # rubocop:disable Custom/AvoidReflection
  visit_and_dismiss_alerts(
    Object.const_get(class_as_string),
    using_params: {
      project_id: @project_id,
      product_id: @product_id,
      queries: @url_queries
    }
  )
  # rubocop:enable Custom/AvoidReflection
end

Given(
  /^I have (existing|new) Project data for (required|all) fields$/
) do |recency, required_or_all|
  project_helper = DataHelpers::Project.new(
    user_name: @users.distribution_user.name
  )
  project_helper.add_optional_fields if required_or_all == "all"
  project_helper.add_new_dropdown_fields if recency == "new"
  @project_data = project_helper.data
  puts "project name: #{@project_data[:name]}"
  puts "project code: #{@project_data[:code]}"
end

When(/^I create a project( with new dropdowns)?$/) do |create_new_dropdowns|
  @browser.alert.ok if @browser.alert.exists?
  on(Project::CreateProjectPage).populate_project_fields_with(@project_data, create_new_dropdowns)
  on(Project::ProjectDetailsPage) do |page|
    page.wait_until { page.save_project? }
    expect(page.project_header).to eq @project_data[:name]
  end
end

When(/^I edit the project$/) do
  on(Project::ProjectDetailsPage) do |page|
    page.wait_for_fields_to_populate
    @project_data[:code] = page.project_code
    page.populate_project_fields_with(@project_data)
    page.save_project
    page.wait_until { page.project_success_message.include? "Your changes have been successfully saved" }
  end
end

Then(/^I should see the correct project details$/) do
  on(Project::ProjectDetailsPage) do |page|
    # page.refresh # field contents could be cached
    page.save_project
    page.wait_for_fields_to_populate
    eventually { expect(page.project_values).to match @project_data }
    @project_id = page.project_id_from_url
  end
  puts "project id: #{@project_id}"
end

Then(/^I should see it in the projects list$/) do
  step "I navigate to Catalog, Catalog using the top nav"
  on(ReactWorkstation::ReactCatalogPage).projects_top_link_element.click
  on(ReactWorkstation::ReactProjectsListPage) do |page|
    page.wait_until { page.projects_table_element.when_present.rows > 1 }
    project_row = page.projects_table_element[@project_data[:code]]
    expect(project_row["NAME"].text).to eql @project_data[:name]
    if @project_data[:subaccount]
      expect(project_row["SUBACCOUNT NAME"].text).to eql @project_data[:subaccount]
    end
  end
end

When(/^I add a product to the project$/) do
  on(Project::ProjectDetailsPage) do |page|
    page.wait_for_page_to_scroll_to_top
    @browser.alert.ok if @browser.alert.exists?
    page.add_new_product
  end
end

When(/^I select (digital audio|video|physical audio) as the product type$/) do |type|
  step_to_text = {
    "digital audio" => "Digital",
    "video" => "Video",
    "physical audio" => "Physical"
  }
  on(Project::CreateProductPage).select_product_type step_to_text[type]
end

Then(/^the video product button should appear on the landing page$/) do
  on(Project::CreateProductPage) do |page|
    expect(page.create_video?).to be true
  end
end

When(
  /^I submit the(?: empty)? (digital audio|physical audio|video) product landing page form$/
) do |type|
  on(Project::CreateProductPage).create_product_button(type).click
end

# TODO: Refactor this into release basics tests
When(/^I wait for the release builder modal to open$/) do
  on(Workstation::CreateAudioModal).create_release_element.when_present(60)
end

Given(/^I have valid (Digital Audio|Music Video|Video) Product data$/) do |product_type|
  @release_data = case product_type
                  when "Digital Audio"
                    DataHelpers::Product.new(label_type: "label").fresh_digital_audio_product_data
                  when "Music Video"
                    DataHelpers::Product.new(label_type: "label").fresh_music_video_product_data
                  when "Video"
                    DataHelpers::Product.new(label_type: "label").fresh_video_product_data
                  else
                    fail "unknown product type!"
                  end
end

Given(/^I am on the Project::ProjectDetailsPage for a newly created project$/) do
  step "I am on the Project::CreateProjectPage"
  step "I have existing Project data for all fields"
  step "I create a project"
  on(Project::ProjectDetailsPage) do |page|
    page.wait_for_fields_to_populate
    @project_id = page.project_id_from_url
  end
end

When(/^I delete the project$/) do
  on(Project::ProjectDetailsPage) do |page|
    page.delete_empty_project
  end
  on(Project::ProjectsListPage).projects_table_element.when_present
end

Then(/^I should not see the project in the projects list$/) do
  on(Project::ProjectsListPage) do |page|
    page.wait_until { page.projects_table_element.when_present.rows > 1 }
    expect(page.projects_table_element[@project_data[:code]]).to be nil
  end
end

Given(/^I have an existing empty project for project_code testing$/) do
  visit(Project::ProjectDetailsPage,
        using_params: {
          project_id: 3_913_173,
          queries: @url_queries
        })
end

When(/^I try to set project_code to an occupied one$/) do
  on(Project::ProjectDetailsPage) do |page|
    page.project_code = ""
    page.project_code = "DIG_5812_occupied"
    page.save_project
  end
end

Then(/^I should( not)? see an error message that the project_code is occupied$/) do |flag|
  on(Project::ProjectDetailsPage) do |page|
    if flag
      page.project_error_element.wait_while(&:present?)
      expect(page.project_error?).to eq false
      expect(page.error_code_occupied?).to eq false
    else
      page.project_error_element.wait_until(&:present?)
      expect(page.project_error?).to eq true
      expect(page.error_code_occupied?).to eq true
      expect(page.error_code_occupied_element.text).to include "already exists"
    end
  end
end

When(/^I try to set project_code to an unique one$/) do
  on(Project::ProjectDetailsPage) do |page|
    page.project_code = Time.stamp
    page.save_project
  end
end

When(/^I add (.*?) as a priority territory from the project management page$/) do |territory_name|
  on(Project::ProjectDetailsPage) do |page|
    page.add_territory_highlight_element.when_present.click
    page.wait_until { page.territories_elements.any? }
    territory_result = page.territories_elements.find do |territory|
      territory.label_element.text.include? territory_name
    end
    territory_result.label_element.click
    page.add
  end
end

Given(/^I am on the Project::ProjectHighlightsPage for the project$/) do
  visit(
    Project::ProjectHighlightsPage,
    using_params: {
      project_id: @project_id,
      queries: @url_queries
    }
  )
end

When(/^I add highlights to my project$/) do
  on(Project::ProjectDetailsPage) do |page|
    @stamp = Time.stamp
    page.marketing_highlights = "Highlight 1 " + @stamp
    page.marketing_territory_highlights = "Highlight 2 " + @stamp
    page.save_highlights
    begin
      page.loading_dots_element.when_present(1)
    rescue Watir::Wait::TimeoutError
      puts "Loading dots were not detected."
    end
    page.loading_dots_element.when_not_present
  end
end

Then(/^my highlights should be visible$/) do
  on(Project::ProjectDetailsPage) do |page|
    page.refresh
    eventually(timeout: 5) do
      expect(page.marketing_highlights).to eql "Highlight 1 " + @stamp
      expect(page.marketing_territory_highlights).to eql "Highlight 2 " + @stamp
    end
  end
end
