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

describe('Client risk path', () => {
    const nightmare = createNightmare();

    beforeAll(() => {
        nightmare
            .loginAndModule('administrative', 'client')
            .accessToSearchResult('Petter Parker');
    });

    it('should now edit the local user config data', async() => {
        let result = await nightmare
            .waitToClick(selectors.globalItems.userMenuButton)
            .autocompleteSearch(selectors.globalItems.userLocalCompany, 'CCs')
            .waitForLastSnackbar();

        expect(result).toEqual('Data saved!');
    });

    it('should access to the risk section to check the data shown matches the local settings', async() => {
        let result = await nightmare
            .accessToSection('client.card.risk.index')
            .waitToGetProperty(`${selectors.clientRisk.companyAutocomplete} input`, 'value');

        expect(result).toEqual('CCs');
    });

    it('should now clear the user local settings', async() => {
        let result = await nightmare
            .waitToClick(selectors.globalItems.userMenuButton)
            .waitToClick(selectors.globalItems.userConfigThirdAutocompleteClear)
            .waitForLastSnackbar();

        expect(result).toEqual('Data saved!');
    });

    it('should click the new payment button', async() => {
        let url = await nightmare
            .reloadSection('client.card.risk.index')
            .waitToClick(selectors.clientRisk.newPaymentButton)
            .waitForURL('/risk')
            .parsedUrl();

        expect(url.hash).toContain('/risk');
    });

    it('should create a new payment that clears the debt', async() => {
        let result = await nightmare
            .clearInput(selectors.clientRisk.newPaymentBankInut)
            .write(selectors.clientRisk.newPaymentBankInut, '2')
            .waitToClick(selectors.clientRisk.saveButton)
            .waitForLastSnackbar();

        expect(result).toContain('Data saved!');
    });

    it('should check balance is now 0 and the company is now VNL becouse the user local settings were removed', async() => {
        let company = await nightmare
            .waitToGetProperty(`${selectors.clientRisk.companyAutocomplete} input`, 'value');

        let firstRiskLineBalance = await nightmare
            .waitToGetProperty(selectors.clientRisk.firstRiskLineBalance, 'innerText');


        expect(company).toEqual('VNL');
        expect(firstRiskLineBalance).toContain('0.00');
    });

    it('should now click the new payment button', async() => {
        let url = await nightmare
            .waitToClick(selectors.clientRisk.newPaymentButton)
            .waitForURL('/risk')
            .parsedUrl();

        expect(url.hash).toContain('/risk');
    });

    it('should create a new payment that sets the balance to positive value', async() => {
        let result = await nightmare
            .clearInput(selectors.clientRisk.newPaymentAmountInput)
            .write(selectors.clientRisk.newPaymentAmountInput, '100')
            .waitToClick(selectors.clientRisk.saveButton)
            .waitForLastSnackbar();

        expect(result).toContain('Data saved!');
    });

    it('should check balance is now 100', async() => {
        let result = await nightmare
            .waitToGetProperty(selectors.clientRisk.firstRiskLineBalance, 'innerText');

        expect(result).toContain('100.00');
    });

    it('should again click the new payment button', async() => {
        let url = await nightmare
            .waitToClick(selectors.clientRisk.newPaymentButton)
            .waitForURL('/risk')
            .parsedUrl();

        expect(url.hash).toContain('/risk');
    });

    it('should create a new payment that sets the balance back to the original negative value', async() => {
        let result = await nightmare
            .clearInput(selectors.clientRisk.newPaymentAmountInput)
            .write(selectors.clientRisk.newPaymentAmountInput, '-150')
            .waitToClick(selectors.clientRisk.saveButton)
            .waitForLastSnackbar();

        expect(result).toContain('Data saved!');
    });

    it('should check balance is now -50', async() => {
        let result = await nightmare
            .waitToGetProperty(selectors.clientRisk.firstRiskLineBalance, 'innerText');

        expect(result).toContain('-€50.00');
    });

    it('should now click on the Clients button of the top bar menu', async() => {
        let url = await nightmare
            .waitForLogin('employee')
            .waitToClick(selectors.globalItems.applicationsMenuButton)
            .wait(selectors.globalItems.applicationsMenuVisible)
            .waitToClick(selectors.globalItems.clientsButton)
            .wait(selectors.clientsIndex.createClientButton)
            .parsedUrl();

        expect(url.hash).toEqual('#!/client/index');
    });

    it('should now search for the user Petter Parker', async() => {
        let resultCount = await nightmare
            .write(selectors.clientsIndex.searchClientInput, 'Petter Parker')
            .waitToClick(selectors.clientsIndex.searchButton)
            .waitForNumberOfElements(selectors.clientsIndex.searchResult, 1)
            .countElement(selectors.clientsIndex.searchResult);

        expect(resultCount).toEqual(1);
    });

    it(`should click on the search result to access to the client's risk`, async() => {
        let url = await nightmare
            .waitForTextInElement(selectors.clientsIndex.searchResult, 'Petter Parker')
            .waitToClick(selectors.clientsIndex.searchResult)
            .waitToClick(selectors.clientRisk.riskButton)
            .waitForURL('/risk')
            .parsedUrl();

        expect(url.hash).toContain('/risk');
    });

    it('should not be able to click the new payment button as it isnt present', async() => {
        let result = await nightmare
            .exists(selectors.clientRisk.newPaymentButton);

        expect(result).toBeFalsy();
    });
});