// @ts-nocheck
declare var Promise: any;
/**
 * E2E Smoke Tests - Cobertura Completa (excepto Reportes)
 *
 * Itera sobre ROUTE_GROUPS y verifica que ninguna ruta devuelva 500.
 * No requiere autenticación: un redirect a /login (302→200) se considera correcto.
 * Agregar E2E_ADMIN_PASSWORD en el entorno para probar las páginas reales en vez del login.
 */

import { test, expect } from '../fixtures/fixtures';
import { ROUTES, ROUTE_GROUPS } from '../fixtures/data';

let sharedAuthState: { cookies: any[] } | null = null;

test.describe('Smoke Tests - Todas las Módulos (excepto Reportes)', () => {
  test.beforeEach(async ({ page, appPage, context }) => {
    const adminPassword = process.env.E2E_ADMIN_PASSWORD || '';
    if (!adminPassword) return; // sin password, solo se verifica no-500
    const adminUser = process.env.E2E_ADMIN_USER || 'admin';

    if (sharedAuthState && sharedAuthState.cookies && sharedAuthState.cookies.length) {
      await context.addCookies(sharedAuthState.cookies);
      return;
    }

    await appPage.login(adminUser, adminPassword);
    const state = await context.storageState();
    sharedAuthState = { cookies: state.cookies || [] };
  });

  for (const route of ROUTE_GROUPS) {
    test(`[${route.group}] ${route.name} no devuelve 500`, async ({ page, appPage, context, networkMonitor }) => {
      const adminPassword = process.env.E2E_ADMIN_PASSWORD || '';
      const adminUser = process.env.E2E_ADMIN_USER || 'admin';

      let response = await page.goto(route.path, { waitUntil: 'commit' });

      // Si la sesion expiro durante la corrida larga, refrescar auth y reintentar una vez.
      const currentPath = new URL(page.url()).pathname;
      if (adminPassword && /\/login(?:_check)?$/.test(currentPath)) {
        sharedAuthState = null;
        await appPage.login(adminUser, adminPassword);
        const state = await context.storageState();
        sharedAuthState = { cookies: state.cookies || [] };
        response = await page.goto(route.path, { waitUntil: 'commit' });
      }

      expect(response, `No se obtuvo respuesta al navegar a "${route.path}"`).not.toBeNull();
      const status = response ? response.status() : 0;
      expect(status, `Ruta "${route.path}" devolvió ${status}`).not.toBe(500);
      expect(status, `Ruta "${route.path}" devolvió error de servidor`).toBeLessThan(500);
      const html = await page.content();
      expect(html.length, `Ruta "${route.path}" devolvió contenido vacío`).toBeGreaterThan(100);
      expect(html, `Ruta "${route.path}" no devolvió HTML válido`).toMatch(/<html/i);

      // Verificar que no haya llamadas AJAX con errores durante la carga de la página
      const ajaxErrors = networkMonitor.getAjaxErrors();
      expect(
        ajaxErrors,
        `Errores AJAX en "${route.path}":\n` +
          ajaxErrors.map((e) => `  ${e.method} ${e.status} → ${e.url}`).join('\n')
      ).toHaveLength(0);
    });
  }

  test('CSS y JS críticos se cargan sin errores (procesos/install)', async ({ page }) => {
    const errors: string[] = [];

    page.on('response', response => {
      if (response.status() >= 400) {
        const url = response.url();
        if (url.includes('.css') || url.includes('.js')) {
          errors.push(`${response.status()} - ${url}`);
        }
      }
    });

    await page.goto(ROUTES.install, { waitUntil: 'commit' });
    await page.waitForLoadState('networkidle');

    expect(errors.length, 'Assets con errores:\n' + errors.join('\n')).toBe(0);
  });
});

