import { defineConfig, devices } from '@playwright/test';

const baseURL = 'http://localhost:3002';

export default defineConfig({
  testDir: './e2e',
  fullyParallel: true,
  forbidOnly: !!process.env.CI,
  retries: process.env.CI ? 2 : 1,
  workers: process.env.CI ? 4 : '50%',
  reporter: [
    ['html', { outputFolder: 'playwright-report' }],
    ['json', { outputFile: 'test-results/results.json' }],
    ['junit', { outputFile: 'test-results/junit.xml' }],
    ['list'],
  ],

  timeout: 120000,
  expect: {
    timeout: 30000,
    toHaveScreenshot: { threshold: 0.2 },
    toMatchSnapshot: { threshold: 0.2 }
  },

  use: {
    baseURL: baseURL,
    trace: process.env.CI ? 'retain-on-failure' : 'on-first-retry',
    screenshot: 'only-on-failure',
    video: process.env.CI ? 'retain-on-failure' : 'on-first-retry',
    actionTimeout: 30000,
    navigationTimeout: 60000,
    headless: process.env.PLAYWRIGHT_HEADLESS === 'true' || process.env.CI === 'true',
    locale: 'zh-CN',
    timezoneId: 'Asia/Shanghai',
    ignoreHTTPSErrors: true,
    bypassCSP: true,
    viewport: { width: 1280, height: 720 },
    launchOptions: {
      slowMo: process.env.CI ? 0 : 100
    },
    contextOptions: {
      permissions: ['geolocation'],
      geolocation: { latitude: 35.6895, longitude: 139.6917 },
      userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
    }
  },

  projects: [
    {
      name: 'ui-test',
      testMatch: '**/basic-ui-test.spec.ts',
      use: { ...devices['Desktop Chrome'] },
    },
    {
      name: 'smoke-test',
      testMatch: '**/smoke/**/*.spec.ts',
      use: { ...devices['Desktop Chrome'] },
    },
    {
      name: 'journey-test',
      testMatch: '**/journeys/**/*.spec.ts',
      use: { ...devices['Desktop Chrome'] },
    },
    {
      name: 'api-test',
      testMatch: '**/api-connectivity.spec.ts',
      use: { ...devices['Desktop Chrome'] },
    },
    {
      name: 'auth-test',
      testMatch: '**/auth-test.spec.ts',
      use: { ...devices['Desktop Chrome'] },
    },
    {
      name: 'menu-management-test',
      testMatch: '**/menu-management.spec.ts',
      use: { ...devices['Desktop Chrome'] },
    },
    {
      name: 'config-management-test',
      testMatch: '**/config-management.spec.ts',
      use: { ...devices['Desktop Chrome'] },
    },
    {
      name: 'dict-management-test',
      testMatch: '**/dict-management.spec.ts',
      use: { ...devices['Desktop Chrome'] },
    },
  ],

  webServer: {
    command: 'pnpm run dev',
    url: baseURL,
    reuseExistingServer: !process.env.CI,
    timeout: 120000,
    stdout: 'pipe',
    stderr: 'pipe'
  },
});