import selectors from '../../helpers/selectors.js';
import getBrowser from '../../helpers/puppeteer';

describe('Entry lastest buys path', () => {
    let browser;
    let page;
    const httpRequests = [];

    beforeAll(async() => {
        browser = await getBrowser();
        page = browser.page;
        page.on('request', req => {
            if (req.url().includes(`Buys/latestBuysFilter`))
                httpRequests.push(req.url());
        });
        await page.loginAndModule('buyer', 'entry');
    });

    afterAll(async() => {
        await browser.close();
    });

    it('should access the latest buys seccion and search not seeing the edit buys button yet', async() => {
        await page.waitToClick(selectors.entryLatestBuys.latestBuysSectionButton);
        await page.waitForSelector(selectors.entryLatestBuys.editBuysButton, {visible: false});
    });

    it('should filter by name', async() => {
        await page.write(selectors.entryLatestBuys.generalSearchInput, 'Melee');
        await page.keyboard.press('Enter');
        await page.waitToClick(selectors.entryLatestBuys.chip);

        expect(httpRequests.find(req => req.includes(('search=Melee')))).toBeDefined();
    });

    it('should filter by reign and type', async() => {
        await page.click(selectors.entryLatestBuys.firstReignIcon);
        await page.autocompleteSearch(selectors.entryLatestBuys.typeInput, 'Alstroemeria');
        await page.click(selectors.entryLatestBuys.chip);

        expect(httpRequests.find(req => req.includes(('categoryFk')))).toBeDefined();
        expect(httpRequests.find(req => req.includes(('typeFk')))).toBeDefined();
    });

    it('should filter by sales person', async() => {
        await page.autocompleteSearch(selectors.entryLatestBuys.salesPersonInput, 'buyerNick');
        await page.waitToClick(selectors.entryLatestBuys.chip);

        expect(httpRequests.find(req => req.includes(('salesPersonFk')))).toBeDefined();
    });

    it('should filter by supplier', async() => {
        await page.autocompleteSearch(selectors.entryLatestBuys.supplierInput, 'Farmer King');
        await page.waitToClick(selectors.entryLatestBuys.chip);

        expect(httpRequests.find(req => req.includes(('supplierFk')))).toBeDefined();
    });

    it('should filter by active', async() => {
        await page.waitToClick(selectors.entryLatestBuys.activeCheck);
        await page.waitToClick(selectors.entryLatestBuys.activeCheck);
        await page.waitToClick(selectors.entryLatestBuys.chip);

        expect(httpRequests.find(req => req.includes(('active=true')))).toBeDefined();
        expect(httpRequests.find(req => req.includes(('active=false')))).toBeDefined();
    });

    it('should filter by visible', async() => {
        await page.waitToClick(selectors.entryLatestBuys.visibleCheck);
        await page.waitToClick(selectors.entryLatestBuys.visibleCheck);
        await page.waitToClick(selectors.entryLatestBuys.chip);

        expect(httpRequests.find(req => req.includes(('visible=true')))).toBeDefined();
        expect(httpRequests.find(req => req.includes(('visible=false')))).toBeDefined();
    });

    it('should filter by floramondo', async() => {
        await page.waitToClick(selectors.entryLatestBuys.floramondoCheck);
        await page.waitToClick(selectors.entryLatestBuys.floramondoCheck);
        await page.waitToClick(selectors.entryLatestBuys.chip);

        expect(httpRequests.find(req => req.includes(('floramondo=true')))).toBeDefined();
        expect(httpRequests.find(req => req.includes(('floramondo=false')))).toBeDefined();
    });

    it('should filter by tag Color', async() => {
        await page.waitToClick(selectors.entryLatestBuys.addTagButton);
        await page.autocompleteSearch(selectors.entryLatestBuys.itemTagInput, 'Color');
        await page.autocompleteSearch(selectors.entryLatestBuys.itemTagValueInput, 'Brown');
        await page.waitToClick(selectors.entryLatestBuys.chip);

        expect(httpRequests.find(req => req.includes(('tags')))).toBeDefined();
    });

    it('should select all lines but one and then check the edit buys button appears', async() => {
        await page.waitToClick(selectors.entryLatestBuys.allBuysCheckBox);
        await page.waitToClick(selectors.entryLatestBuys.secondBuyCheckBox);
        await page.waitForSelector(selectors.entryLatestBuys.editBuysButton, {visible: true});
    });

    it('should open the edit dialog', async() => {
        await page.waitToClick(selectors.entryLatestBuys.editBuysButton);
        await page.waitForSelector(selectors.entryLatestBuys.fieldAutocomplete, {visible: true});
    });

    it('should search for the "Description" and type a new one for the items in each selected buy', async() => {
        await page.autocompleteSearch(selectors.entryLatestBuys.fieldAutocomplete, 'Description');
        await page.write(selectors.entryLatestBuys.newValueInput, 'Crafted item');
        await page.waitToClick(selectors.entryLatestBuys.acceptEditBuysDialog);
    });

    it('should navigate to the entry.buy section by clicking one of the buys', async() => {
        await page.waitToClick(selectors.entryLatestBuys.firstBuy);
        await page.waitForState('entry.card.buy.index');
    });
});