import { Browser, launch, Page } from 'puppeteer';
import { Mockiavelli } from '../../../src';
import { makeRequest } from '../test-helpers/make-request';

const PORT = 9000;

export interface PuppeteerTestCtx {
    page?: Page;
    mockiavelli?: Mockiavelli;
    makeRequest?: ReturnType<typeof makeRequestFactory>;
}

export function setupPuppeteerCtx() {
    let browser: Browser;

    const testCtx: PuppeteerTestCtx = {};

    beforeAll(async () => {
        browser = await launch({
            headless: true,
            devtools: false,
            args: ['--no-sandbox'],
        });
    });

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

    beforeEach(async () => {
        // Setup new page (tab)
        testCtx.page = await browser.newPage();
        await testCtx.page.goto(`http://localhost:${PORT}`);

        // Instantiate
        testCtx.mockiavelli = await Mockiavelli.setup(testCtx.page);
        testCtx.makeRequest = makeRequestFactory(testCtx.page);
    });

    afterEach(async () => {
        await testCtx.page.close();
    });

    return testCtx;
}

function makeRequestFactory(page: Page) {
    return (
        method: string,
        url: string,
        headers?: Record<string, string>,
        body?: any,
        options?: { waitForRequestEnd: boolean }
    ): ReturnType<typeof makeRequest> =>
        page.evaluate(makeRequest, {
            url,
            method,
            headers,
            body,
            options,
        });
}