import selectors from '../../helpers/selectors.js';
import createNightmare from '../../helpers/nightmare';

describe('Ticket', () => {
    describe('Edit basic data path', () => {
        const nightmare = createNightmare();

        beforeAll(() => {
            return nightmare
                .waitForLogin('employee');
        });

        it('should click on the Tickets button of the top bar menu', (done) => {
            return nightmare
                .waitToClick(selectors.globalItems.applicationsMenuButton)
                .wait(selectors.globalItems.applicationsMenuVisible)
                .waitToClick(selectors.globalItems.ticketsButton)
                .wait(selectors.ticketsIndex.searchResult)
                .parsedUrl()
                .then((url) => {
                    expect(url.hash).toEqual('#!/ticket/index');
                    done();
                }).catch(done.fail);
        });

        it('should search for the ticket 11', (done) => {
            return nightmare
                .wait(selectors.ticketsIndex.searchResult)
                .type(selectors.ticketsIndex.searchTicketInput, 'id:11')
                .click(selectors.ticketsIndex.searchButton)
                .waitForNumberOfElements(selectors.ticketsIndex.searchResult, 1)
                .countElement(selectors.ticketsIndex.searchResult)
                .then((result) => {
                    expect(result).toEqual(1);
                    done();
                }).catch(done.fail);
        });

        it(`should click on the search result to access to the ticket Basic Data`, (done) => {
            return nightmare
                .waitForTextInElement(selectors.ticketsIndex.searchResult, 'address 21') // should be Bruce Wayne
                .waitToClick(selectors.ticketsIndex.searchResult)
                .waitToClick(selectors.ticketBasicData.basicDataButton)
                .waitForURL('data/step-one')
                .url()
                .then((url) => {
                    expect(url).toContain('data/step-one');
                    done();
                }).catch(done.fail);
        });

        it(`should edit the client and address of the ticket then click next`, (done) => {
            return nightmare
                .waitToClick(selectors.ticketBasicData.clientSelect)
                .waitToClick(selectors.ticketBasicData.clientSelectThirdOption)
                .wait(500)
                .waitToClick(selectors.ticketBasicData.addressSelect)
                .waitToClick(selectors.ticketBasicData.addressSelectSecondOption)
                .waitForTextInInput(selectors.ticketBasicData.addressSelect, 'Charles Xavier')
                .click(selectors.ticketBasicData.nextStepButton)
                .waitForURL('data/step-two')
                .url()
                .then((url) => {
                    expect(url).toContain('data/step-two');
                    done();
                }).catch(done.fail);
        });

        it(`should have no price diference`, (done) => {
            return nightmare
                .getInnerText(selectors.ticketBasicData.stepTwoTotalPriceDif)
                .then((result) => {
                    expect(result).toContain('0');
                    done();
                }).catch(done.fail);
        });

        it(`should click next to move on to step three`, (done) => {
            return nightmare
                .click(selectors.ticketBasicData.nextStepButton)
                .waitForURL('data/step-three')
                .url()
                .then((url) => {
                    expect(url).toContain('data/step-three');
                    done();
                }).catch(done.fail);
        });

        it(`should select a reason for the changes made then click on finalize`, (done) => {
            return nightmare
                .waitToClick(selectors.ticketBasicData.chargesReason)
                .waitToClick(selectors.ticketBasicData.chargesReasonFourthOption)
                .waitForTextInInput(selectors.ticketBasicData.chargesReason, 'No realizar modificaciones en precios')
                .click(selectors.ticketBasicData.finalizeButton)
                .waitForURL('summary')
                .url()
                .then((url) => {
                    expect(url).toContain('summary');
                    done();
                }).catch(done.fail);
        });

        it(`should go back to ticket.basicData section`, (done) => {
            return nightmare
                .waitToClick(selectors.ticketBasicData.basicDataButton)
                .waitForURL('data/step-one')
                .url()
                .then((url) => {
                    expect(url).toContain('data/step-one');
                    done();
                }).catch(done.fail);
        });

        it(`should edit the ticket agency then click next`, (done) => {
            return nightmare
                .waitToClick(selectors.ticketBasicData.agencySelect)
                .waitToClick(selectors.ticketBasicData.agencySelectOptionSix)
                .waitForTextInInput(selectors.ticketBasicData.agencySelect, 'Expensive')
                .click(selectors.ticketBasicData.nextStepButton)
                .waitForURL('data/step-two')
                .url()
                .then((url) => {
                    expect(url).toContain('data/step-two');
                    done();
                }).catch(done.fail);
        });

        it(`should have a price diference`, (done) => {
            return nightmare
                .getInnerText(selectors.ticketBasicData.stepTwoTotalPriceDif)
                .then((result) => {
                    expect(result).toContain('-20.65');
                    done();
                }).catch(done.fail);
        });

        it(`should then click next to move on to step three`, (done) => {
            return nightmare
                .click(selectors.ticketBasicData.nextStepButton)
                .waitForURL('data/step-three')
                .url()
                .then((url) => {
                    expect(url).toContain('data/step-three');
                    done();
                }).catch(done.fail);
        });

        it(`should select a new reason for the changes made then click on finalize`, (done) => {
            return nightmare
                .waitToClick(selectors.ticketBasicData.chargesReason)
                .waitToClick(selectors.ticketBasicData.chargesReasonFirstOption)
                .waitForTextInInput(selectors.ticketBasicData.chargesReason, 'Cambiar los precios en el ticket')
                .click(selectors.ticketBasicData.finalizeButton)
                .waitForURL('summary')
                .url()
                .then((url) => {
                    expect(url).toContain('summary');
                    done();
                }).catch(done.fail);
        });
    });
});