import { defineConfig } from '@playwright/test';
import { loadEnvFiles } from './tests/e2e/helpers/env';

loadEnvFiles(['.dev.vars']);

const PORT = Number(process.env.PORT ?? 4327);
const BASE_URL = process.env.BASE_URL ?? `http://127.0.0.1:${PORT}`;
const factoryMode = process.env.E2E_FACTORY_MODE === '1';
if (factoryMode) process.env.E2E_SWEEP_MODE = '1';
// This is a live-readonly sweep suite, so this config is its explicit opt-in.
process.env.ALLOW_LIVE_E2E ??= '1';
const isExternalUrl = !BASE_URL.includes('localhost') && !BASE_URL.includes('127.0.0.1');
const skipWebServer = process.env.SWEEP_NO_WEBSERVER === '1';

export const sweepPreflightContract = {
  healthPath: '/api/health',
  anonymousPaths: ['/', '/search'],
  edgeCacheEnvironment: 'test',
  sentinels: [
    {
      role: 'customer',
      path: '/profile',
      sessionRole: 'customer',
      htmlData: { auth: 'user', admin: '0', vendor: '0' },
    },
    {
      role: 'vendor',
      path: '/vendor/profile',
      sessionRole: 'vendor',
      htmlData: { auth: 'user', admin: '0', vendor: '1' },
    },
    {
      role: 'admin',
      path: '/admin',
      sessionRole: 'admin',
      htmlData: {},
    },
  ],
  websocketPath: '/api/ws',
  // The factory preview runs on local workerd, which never upgrades a socket.
  websocketState: factoryMode ? 'disabled' : 'supported',
} as const;

const sweepProjects = [
  ...(factoryMode ? [{ name: 'content-seed', testMatch: /01-content-seed\.spec\.ts/ }] : []),
  {
    name: 'preflight',
    dependencies: factoryMode ? ['content-seed'] : [],
    testMatch: /00-preflight\.spec\.ts/,
  },
  {
    name: 'desktop-1280',
    dependencies: ['preflight'],
    testIgnore: /00-preflight\.spec\.ts|01-content-seed\.spec\.ts/,
    use: { viewport: { width: 1280, height: 900 }, isMobile: false },
  },
  {
    name: 'mobile-390',
    dependencies: ['preflight'],
    testIgnore: /00-preflight\.spec\.ts|01-content-seed\.spec\.ts/,
    use: { viewport: { width: 390, height: 844 }, isMobile: true },
  },
];

export default defineConfig({
  testDir: './tests/e2e/sweep',
  fullyParallel: true,
  forbidOnly: !!process.env.CI,
  retries: 0,
  workers: 1,
  reporter: [
    ['list'],
    ['json', { outputFile: 'tests/e2e/sweep/sweep-results.json' }],
    ['./tests/e2e/sweep/sweep-run-reporter.ts'],
  ],
  timeout: 45_000,
  expect: { timeout: 5_000 },
  use: {
    baseURL: BASE_URL,
    trace: 'retain-on-failure',
    screenshot: 'only-on-failure',
    timezoneId: 'Asia/Jerusalem',
  },
  projects: sweepProjects,
  ...(!isExternalUrl &&
    !skipWebServer && {
      webServer: {
        command: factoryMode
          ? 'node scripts/factory-preview-server.mjs'
          : process.env.CI || process.env.SWEEP_SKIP_BUILD === '1'
            ? `pnpm preview --host 127.0.0.1 --port ${PORT}`
            : `pnpm build && pnpm preview --host 127.0.0.1 --port ${PORT}`,
        url: factoryMode ? `${BASE_URL}/api/health` : `${BASE_URL}/robots.txt`,
        reuseExistingServer: factoryMode ? false : !process.env.CI,
        stdout: 'pipe',
        stderr: 'pipe',
        timeout: process.env.CI ? 180_000 : 300_000,
      },
    }),
});
