import {createFakeUserAndLogin} from '../../support/authenticateUser'

import {TeamFactory} from '../../factories/team'
import {TeamMemberFactory} from '../../factories/team_member'
import {UserFactory} from '../../factories/user'

describe('Team', () => {
	createFakeUserAndLogin()

    it('Creates a new team', () => {
        TeamFactory.truncate()
        cy.visit('/teams')

        const newTeamName = 'New Team'

        cy.get('a.button')
            .contains('Create a new team')
            .click()
		cy.url()
			.should('contain', '/teams/new')
		cy.get('.card-header-title')
			.contains('Create a new team')
		cy.get('input.input')
			.type(newTeamName)
		cy.get('.button')
			.contains('Create')
			.click()

		cy.url()
            .should('contain', '/edit')
        cy.get('input#teamtext')
            .should('have.value', newTeamName)
    })

    it('Shows all teams', () => {
        TeamMemberFactory.create(10, {
            team_id: '{increment}',
        })
        const teams = TeamFactory.create(10, {
            id: '{increment}',
        })

        cy.visit('/teams')

        cy.get('.teams.box')
            .should('not.be.empty')
        teams.forEach(t => {
            cy.get('.teams.box')
                .should('contain', t.name)
        })
    })

    it('Allows an admin to edit the team', () => {
        TeamMemberFactory.create(1, {
            team_id: 1,
            admin: true,
        })
        const teams = TeamFactory.create(1, {
            id: 1,
        })
        
        cy.visit('/teams/1/edit')
        cy.get('.card input.input')
            .first()
            .type('{selectall}New Team Name')

        cy.get('.card .button')
            .contains('Save')
            .click()
        
        cy.get('table.table td')
            .contains('Admin')
            .should('exist')
        cy.get('.global-notification')
			.should('contain', 'Success')
    })

    it('Does not allow a normal user to edit the team', () => {
        TeamMemberFactory.create(1, {
            team_id: 1,
            admin: false,
        })
        const teams = TeamFactory.create(1, {
            id: 1,
        })
        
        cy.visit('/teams/1/edit')
        cy.get('.card input.input')
            .should('not.exist')
        cy.get('table.table td')
            .contains('Member')
            .should('exist')
    })

    it('Allows an admin to add members to the team', () => {
        TeamMemberFactory.create(1, {
            team_id: 1,
            admin: true,
        })
        TeamFactory.create(1, {
            id: 1,
        })
        const users = UserFactory.create(5)
        
        cy.visit('/teams/1/edit')
        cy.get('.card')
            .contains('Team Members')
            .get('.card-content .multiselect .input-wrapper input')
            .type(users[1].username)
        cy.get('.card')
            .contains('Team Members')
            .get('.card-content .multiselect .search-results')
				.children()
				.first()
				.click()
        cy.get('.card')
            .contains('Team Members')
            .get('.card-content .button')
            .contains('Add to team')
            .click()
        
        cy.get('table.table td')
            .contains('Admin')
            .should('exist')
        cy.get('table.table tr')
            .should('contain', users[1].username)
            .should('contain', 'Member')
        cy.get('.global-notification')
			.should('contain', 'Success')
    })
})
