Given /^I have a project "([^\"]*)" with (.*) todos$/ do |project_name, num_todos|
  @context = @current_user.contexts.find_or_create_by_name("Context A")
  @project = @current_user.projects.create!(:name => project_name)
  1.upto num_todos.to_i do |i|
    @current_user.todos.create!(
      :project_id => @project.id,
      :context_id => @context.id,
      :description => "todo #{i}")
  end
end

Given /^there exists a project "([^\"]*)" for user "([^\"]*)"$/ do |project_name, user_name|
  user = User.find_by_login(user_name)
  user.should_not be_nil
  @project = user.projects.create!(:name => project_name)
end

Given /^there exists a project called "([^"]*)" for user "([^"]*)"$/ do |project_name, login|
  # TODO: regexp change to integrate this with the previous since only 'called' is different
  Given "there exists a project \"#{project_name}\" for user \"#{login}\""
end

Given /^I have a project called "([^"]*)"$/ do |project_name|
  Given "there exists a project \"#{project_name}\" for user \"#{@current_user.login}\""
end

Given /^I have a project "([^"]*)" with a default context of "([^"]*)"$/ do |project_name, context_name|
  Given "there exists a project \"#{project_name}\" for user \"#{@current_user.login}\""
  context = @current_user.contexts.create!(:name => context_name)
  @project.default_context = context
  @project.save!
end

Given /^I have the following projects:$/ do |table|
  table.hashes.each do |project|
    Given 'I have a project called "'+project[:project_name]+'"'
  end
end

Given /^I have a completed project called "([^"]*)"$/ do |project_name|
  Given "I have a project called \"#{project_name}\""
  @project.complete!
  @project.reload
  assert @project.completed?
end

Given /^I have (\d+) completed projects$/ do |number_of_projects|
  1.upto number_of_projects.to_i do |i|
    Given "I have a completed project called \"Project #{i}\""
  end
end

Given /^I have no projects$/ do
  Project.delete_all
end

Given /^I have a hidden project called "([^"]*)"$/ do |project_name|
  @project = @current_user.projects.create!(:name => project_name)
  @project.hide!
end

When /^I open the project edit form$/ do
  click_link "link_edit_project_#{@project.id}"

  wait_for do
    selenium.is_element_present("submit_project_#{@project.id}")
  end
end

When /^I cancel the project edit form$/ do
  click_link "cancel_project_#{@project.id}"

  if selenium.is_visible("submit_project_#{@project.id}")
    wait_for do
      !selenium.is_visible("submit_project_#{@project.id}")
    end
  end
end

When /^I edit the project description to "([^\"]*)"$/ do |new_description|
  click_link "link_edit_project_#{@project.id}"
  fill_in "project[description]", :with => new_description
  click_button "submit_project_#{@project.id}"

  wait_for do
    !selenium.is_element_present("submit_project_#{@project.id}")
  end
end

When /^I edit the project name to "([^\"]*)"$/ do |new_title|
  click_link "link_edit_project_#{@project.id}"

  wait_for do
    selenium.is_element_present("submit_project_#{@project.id}")
  end

  fill_in "project[name]", :with => new_title

  selenium.click "submit_project_#{@project.id}",
    :wait_for => :text,
    :text => "Project saved",
    :timeout => 5

  wait_for do
    !selenium.is_element_present("submit_project_#{@project.id}")
  end
end

When /^I try to edit the project name to "([^\"]*)"$/ do |new_title|
  click_link "link_edit_project_#{@project.id}"

  wait_for do
    selenium.is_element_present("submit_project_#{@project.id}")
  end

  fill_in "project[name]", :with => new_title

  selenium.click "submit_project_#{@project.id}",
    :wait_for => :text,
    :text => "There were problems with the following fields:",
    :timeout => 5
end

When /^I edit the project name of "([^"]*)" to "([^"]*)"$/ do |project_current_name, project_new_name|
  @project = @current_user.projects.find_by_name(project_current_name)
  @project.should_not be_nil
  When "I edit the project name to \"#{project_new_name}\""
end

When /^I try to edit the project name of "([^"]*)" to "([^"]*)"$/ do |project_current_name, project_new_name|
  @project = @current_user.projects.find_by_name(project_current_name)
  @project.should_not be_nil
  When "I try to edit the project name to \"#{project_new_name}\""
end

When /^I edit the project name in place to be "([^"]*)"$/ do |new_project_name|
  selenium.click "project_name"
  fill_in "value", :with => new_project_name
  click_button "Ok"
end

When /^I edit the project state of "([^"]*)" to "([^"]*)"$/ do |project_name, state_name|
  project = @current_user.projects.find_by_name(project_name)
  project.should_not be_nil

  click_link "link_edit_project_#{project.id}"
  selenium.wait_for_element("xpath=//div[@id='edit_project_#{project.id}']/form//button[@id='submit_project_#{project.id}']")

  choose "project_state_#{state_name}"

  # changed to make sure selenium waits until the saving has a result either
  # positive or negative. Was: :element=>"flash", :text=>"Project saved"
  # we may need to change it back if you really need a positive outcome, i.e.
  # this step needs to fail if the project was not saved successfully
  selenium.click "submit_project_#{project.id}",
    :wait_for => :text,
    :text => /(Project saved|1 error prohibited this project from being saved)/

  wait_for do # wait for the form to go away
    !selenium.is_element_present("submit_project_#{project.id}")
  end
end

When /^I add a note "([^"]*)" to the project$/ do |note_body|
  click_link "Add a note"
  fill_in "note[body]", :with => note_body
  click_button "Add note"
end

When /^I click on the first note icon$/ do
  @project.should_not be_nil
  @note = @project.notes.first # assume first note is also first on screen
  @note.should_not be_nil

  click_link "link_note_#{@note.id}"
end

When /^I cancel adding a note to the project$/ do
  click_link "Add a note"
  fill_in "note[body]", :with => "will not save this"
  click_link "neg_edit_form_note"
end

Then /^the form for adding a note should not be visible$/ do
  wait_for do # wait for the form to go away
    !selenium.is_visible("edit_form_note")
  end
end

Then /^I should go to that note page$/ do
  current_path = URI.parse(current_url).path
  note_path = note_path(@note)
  current_path.should == note_path
end

Then /^I should see one note in the project$/ do
  selenium.wait_for_element("xpath=//div[@class='note_wrapper']")
end

Then /^I should see the bold text "([^\"]*)" in the project description$/ do |bold|
  xpath="//div[@class='project_description']/p/strong"

  response.should have_xpath(xpath)
  bold_text = response.selenium.get_text("xpath=#{xpath}")

  bold_text.should =~ /#{bold}/
end

Then /^I should see the italic text "([^\"]*)" in the project description$/ do |italic|
  xpath="//div[@class='project_description']/p/em"

  response.should have_xpath(xpath)
  italic_text = response.selenium.get_text("xpath=#{xpath}")

  italic_text.should =~ /#{italic}/
end

Then /^the project title should be "(.*)"$/ do |title|
  selenium.get_text("css=h2#project_name").should == title
end

Then /^I should see the project name is "([^"]*)"$/ do |project_name|
  Then "the project title should be \"#{project_name}\""
end
