/* eslint-disable @typescript-eslint/no-explicit-any */
import { test as base } from '@playwright/test';
import Selectors from './Locators/index';
import { BrowserContext } from '@playwright/test';

// Definición de los tipos de fixtures personalizados
type MyFixtures = {
	globalSelectors: Selectors;
};

type WorkerFixtures = {
	skipAuth: boolean;
	authContext: BrowserContext;
	_autoAuth: void;
};

// Extensión del test de Playwright con los fixtures personalizados
export const test = base.extend<MyFixtures, WorkerFixtures>({
	skipAuth: [false, { option: true, scope: 'worker' }],

	authContext: [async ({ browser, skipAuth }, use) => {
		const context = await browser.newContext();

		let page:any;
		let selectors:any;

		if (!skipAuth) {
			await context.addCookies([
				{
					name: '_secPrint',
					value: '822ebceb-0e9c-40fe-a29c-0de70453bf0b',
					domain: '.demo.paguetodo.com',
					path: '/'
				}
			]);

			page = await context.newPage();
			selectors = new Selectors(page);

			await selectors.page.goto(process.env.BASE_URL || '');
			await selectors.page.waitForTimeout(1_500);
			await selectors.fields.emailInput.fill(process.env.EMAIL || '');
			await selectors.fields.passwordInput.fill(process.env.PASSWORD || '');
			await selectors.buttons.loginButton.click();
			await selectors.page.waitForTimeout(1_500);
			await selectors.page.waitForURL('**/apps');
			await selectors.page.context().storageState({ path: 'auth.json' });
		}
		await use(context);
		if (!skipAuth && page && selectors) {
			await selectors.buttons.logoutButton.click();
			await selectors.page.waitForTimeout(1500);
			await page.close();
		}
		await context.close();
	}, { scope: 'worker' }],

	_autoAuth: [async ({ authContext }, use) => {
		void authContext;
		await use();
	}, { auto: true, scope: 'worker' }],

	// Fixture para selectores globales
	globalSelectors: async ({ page }, use) => {
		const selectorsInstance = new Selectors(page);
		await use(selectorsInstance);
	},
});