class AdminTeams < Spinach::FeatureSteps
  include SharedAuthentication
  include SharedPaths
  include SharedActiveTab
  include SharedAdmin

  And 'I have own project' do
    create :project
  end

  And 'Create gitlab user "John"' do
    @user = create(:user, name: "John")
  end

  And 'I click new team link' do
    click_link "New Team"
  end

  And 'submit form with new team info' do
    fill_in 'user_team_name', with: 'gitlab'
    fill_in 'user_team_description', with: 'description'
    click_button 'Create team'
  end

  Then 'I should be redirected to team page' do
    current_path.should == admin_team_path(UserTeam.last)
  end

  And 'I should see newly created team' do
    page.should have_content "Team: gitlab"
    page.should have_content "description"
  end

  When 'I visit admin teams page' do
    visit admin_teams_path
  end

  When 'I have clean "HardCoders" team' do
    @team = create :user_team, name: "HardCoders", owner: current_user
  end

  And 'I visit "HardCoders" team page' do
    visit admin_team_path(UserTeam.find_by_name("HardCoders"))
  end

  Then 'I should see only me in members table' do
    members_list = find("#members_list .member")
    members_list.should have_content(current_user.name)
    members_list.should have_content(current_user.username)
  end

  When 'I select user "John" from user list as "Developer"' do
    @user ||= User.find_by_name("John")
    within "#team_members" do
      select "#{@user.name} (#{@user.username})", from: "user_ids"
      select "Developer", from: "default_project_access"
    end
  end

  And 'submit form with new team member info' do
    click_button 'add_members_to_team'
  end

  Then 'I should see "John" in teams members list as "Developer"' do
    @user ||= User.find_by_name("John")
    find_in_list("#members_list .member", @user).must_equal true
  end

  When 'I visit "John" user admin page' do
    pending 'step not implemented'
  end

  Then 'I should see "HardCoders" team in teams table' do
    pending 'step not implemented'
  end

  When 'I have "HardCoders" team with "John" member with "Developer" role' do
    @team = create :user_team, name: "HardCoders", owner: current_user
    @user ||= User.find_by_name("John")
    @team.add_member(@user, UserTeam.access_roles["Developer"], group_admin: false)
  end

  When 'I have "Shop" project' do
    @project = create :project, name: "Shop"
  end

  Then 'I should see empty projects table' do
    page.should have_content "Projects (0)"
  end

  When 'I select project "Shop" with max access "Reporter"' do
    @project ||= Project.find_by_name("Shop")
    within "#assign_projects" do
      select @project.name, from: "project_ids"
      select "Reporter", from: "greatest_project_access"
    end

  end

  And 'submit form with new team project info' do
    click_button 'assign_projects_to_team'
  end

  Then 'I should see "Shop" project in projects list' do
    project = Project.find_by_name("Shop")
    find_in_list("#projects_list .project", project).must_equal true
  end

  When 'I visit "Shop" project admin page' do
    project = Project.find_by_name("Shop")
    visit admin_project_path(project)
  end

  And '"HardCoders" team assigned to "Shop" project with "Developer" max role access' do
    @team = UserTeam.find_by_name("HardCoders")
    @project = create :project, name: "Shop"
    @team.assign_to_project(@project, UserTeam.access_roles["Developer"])
  end

  When 'I have gitlab user "Jimm"' do
    create :user, name: "Jimm"
  end

  Then 'I should see members table without "Jimm" member' do
    user = User.find_by_name("Jimm")
    find_in_list("#members_list .member", user).must_equal false
  end

  When 'I select user "Jimm" ub team members list as "Master"' do
    user = User.find_by_name("Jimm")
    within "#team_members" do
      select "#{user.name} (#{user.username})", from: "user_ids"
      select "Developer", from: "default_project_access"
    end
  end

  Then 'I should see "Jimm" in teams members list as "Master"' do
    user = User.find_by_name("Jimm")
    find_in_list("#members_list .member", user).must_equal true
  end

  Given 'I have users team "HardCoders"' do
    @team = create :user_team, name: "HardCoders"
  end

  And 'gitlab user "John" is a member "HardCoders" team' do
    @team = UserTeam.find_by_name("HardCoders")
    @user = User.find_by_name("John")
    @user = create :user, name: "John" unless @user
    @team.add_member(@user, UserTeam.access_roles["Master"], group_admin: false)
  end

  And 'gitlab user "Jimm" is a member "HardCoders" team' do
    @team = UserTeam.find_by_name("HardCoders")
    @user = User.find_by_name("Jimm")
    @user = create :user, name: "Jimm" unless @user
    @team.add_member(@user, UserTeam.access_roles["Master"], group_admin: false)
  end

  And '"HardCoders" team is assigned to "Shop" project' do
    @team = UserTeam.find_by_name("HardCoders")
    @project = create :project, name: "Shop"
    @team.assign_to_project(@project, UserTeam.access_roles["Developer"])
  end

  When 'I visit "HardCoders" team admin page' do
    visit admin_team_path(UserTeam.find_by_name("HardCoders"))
  end

  Then 'I shoould see "John" in members list' do
    user = User.find_by_name("John")
    find_in_list("#members_list .member", user).must_equal true
  end

  And 'I should see "Jimm" in members list' do
    user = User.find_by_name("Jimm")
    find_in_list("#members_list .member", user).must_equal true
  end

  And 'I should see "Shop" in projects list' do
    project = Project.find_by_name("Shop")
    find_in_list("#projects_list .project", project).must_equal true
  end

  When 'I click on remove "Jimm" user link' do
    user = User.find_by_name("Jimm")
    click_link "remove_member_#{user.id}"
  end

  Then 'I should be redirected to "HardCoders" team admin page' do
    current_path.should == admin_team_path(UserTeam.find_by_name("HardCoders"))
  end

  And 'I should not to see "Jimm" user in members list' do
    user = User.find_by_name("Jimm")
    find_in_list("#members_list .member", user).must_equal false
  end

  When 'I click on "Relegate" link on "Shop" project' do
    project = Project.find_by_name("Shop")
    click_link "relegate_project_#{project.id}"
  end

  Then 'I should see projects liston team page without "Shop" project' do
    project = Project.find_by_name("Shop")
    find_in_list("#projects_list .project", project).must_equal false
  end

  Then 'I should see "John" user with role "Reporter" in team table' do
    user = User.find_by_name("John")
    find_in_list(".team_members", user).must_equal true
  end

  When 'I click to "Add members" link' do
    click_link "Add members"
  end

  When 'I click to "Add projects" link' do
    click_link "Add projects"
  end

  protected

  def current_team
    @team ||= Team.first
  end

  def find_in_list(selector, item)
    members_list = all(selector)
    entered = false
    members_list.each do |member_item|
      entered = true if member_item.has_content?(item.name)
    end
    entered
  end
end