name: PR E2E Tests

on:
  pull_request:
    types:
      - opened
      - synchronize
      - reopened
      - ready_for_review
    paths:
      - 'web/**'
      - 'server/**'
      - 'scripts/**'
      - 'docker-compose.yml'
      - 'docker-compose.staging.yml'
      - 'Makefile'
      - '.github/workflows/pr-e2e.yml'
  workflow_dispatch:

concurrency:
  group: pr-e2e-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  e2e-tests:
    name: E2E (Real Services)
    if: ${{ github.event_name != 'pull_request' || !github.event.pull_request.draft }}
    runs-on: ubuntu-latest
    timeout-minutes: 90

    steps:
      - name: Check out repository
        uses: actions/checkout@v4
        with:
          persist-credentials: false

      - name: Verify Kubernetes PostgreSQL data-directory compatibility
        run: bash scripts/tests/k8s-postgres-storage-test.sh

      - name: Set up pnpm
        uses: pnpm/action-setup@v4
        with:
          version: 9

      - name: Set up Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: pnpm
          cache-dependency-path: web/pnpm-lock.yaml

      - name: Set up Java
        uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: 21
          cache: maven

      - name: Ensure Maven wrapper is executable
        run: chmod +x server/mvnw

      - name: Start full dev stack
        run: make dev-all

      - name: Install Playwright browsers
        run: cd web && pnpm exec playwright install --with-deps chromium

      - name: Run frontend E2E tests
        run: make test-e2e-frontend

      - name: Upload Playwright HTML report
        if: ${{ !cancelled() }}
        uses: actions/upload-artifact@v4
        with:
          name: playwright-report
          path: web/playwright-report/
          if-no-files-found: warn
          retention-days: 30

      - name: Upload Playwright raw test results
        if: ${{ !cancelled() }}
        uses: actions/upload-artifact@v4
        with:
          name: playwright-test-results
          path: web/test-results/
          if-no-files-found: warn
          retention-days: 14

      - name: Stop full dev stack
        if: ${{ always() }}
        run: make dev-all-down
