name: E2E Tests

on:
  pull_request:
    branches:
      - '*'
  push:
    branches:
      - main
      - master

jobs:
  e2e:
    runs-on: ubuntu-latest
    timeout-minutes: 15

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup project
        uses: ./.github/actions/setup-project
        with:
          check-lockfile: 'true'
          rebuild-node-pty-path: 'apps/server'

      - name: Install Playwright browsers
        run: npx playwright install --with-deps chromium
        working-directory: apps/ui

      - name: Build server
        run: npm run build --workspace=apps/server

      - name: Set up Git user
        run: |
          git config --global user.name "GitHub CI"
          git config --global user.email "ci@example.com"

      - name: Start backend server
        run: |
          echo "Starting backend server..."
          # Start server in background and save PID
          npm run start --workspace=apps/server > backend.log 2>&1 &
          SERVER_PID=$!
          echo "Server started with PID: $SERVER_PID"
          echo "SERVER_PID=$SERVER_PID" >> $GITHUB_ENV

        env:
          PORT: 3008
          NODE_ENV: test
          # Use a deterministic API key so Playwright can log in reliably
          AUTOMAKER_API_KEY: test-api-key-for-e2e-tests
          # Reduce log noise in CI
          AUTOMAKER_HIDE_API_KEY: 'true'
          # Avoid real API calls during CI
          AUTOMAKER_MOCK_AGENT: 'true'
          # Simulate containerized environment to skip sandbox confirmation dialogs
          IS_CONTAINERIZED: 'true'

      - name: Wait for backend server
        run: |
          echo "Waiting for backend server to be ready..."

          # Check if server process is running
          if [ -z "$SERVER_PID" ]; then
            echo "ERROR: Server PID not found in environment"
            cat backend.log 2>/dev/null || echo "No backend log found"
            exit 1
          fi

          # Check if process is actually running
          if ! kill -0 $SERVER_PID 2>/dev/null; then
            echo "ERROR: Server process $SERVER_PID is not running!"
            echo "=== Backend logs ==="
            cat backend.log
            echo ""
            echo "=== Recent system logs ==="
            dmesg 2>/dev/null | tail -20 || echo "No dmesg available"
            exit 1
          fi

          # Wait for health endpoint
          for i in {1..60}; do
            if curl -s -f http://localhost:3008/api/health > /dev/null 2>&1; then
              echo "Backend server is ready!"
              echo "=== Backend logs ==="
              cat backend.log
              echo ""
              echo "Health check response:"
              curl -s http://localhost:3008/api/health | jq . 2>/dev/null || echo "Health check: $(curl -s http://localhost:3008/api/health 2>/dev/null || echo 'No response')"
              exit 0
            fi
            
            # Check if server process is still running
            if ! kill -0 $SERVER_PID 2>/dev/null; then
              echo "ERROR: Server process died during wait!"
              echo "=== Backend logs ==="
              cat backend.log
              exit 1
            fi
            
            echo "Waiting... ($i/60)"
            sleep 1
          done

          echo "ERROR: Backend server failed to start within 60 seconds!"
          echo "=== Backend logs ==="
          cat backend.log
          echo ""
          echo "=== Process status ==="
          ps aux | grep -E "(node|tsx)" | grep -v grep || echo "No node processes found"
          echo ""
          echo "=== Port status ==="
          netstat -tlnp 2>/dev/null | grep :3008 || echo "Port 3008 not listening"
          lsof -i :3008 2>/dev/null || echo "lsof not available or port not in use"
          echo ""
          echo "=== Health endpoint test ==="
          curl -v http://localhost:3008/api/health 2>&1 || echo "Health endpoint failed"

          # Kill the server process if it's still hanging
          if kill -0 $SERVER_PID 2>/dev/null; then
            echo ""
            echo "Killing stuck server process..."
            kill -9 $SERVER_PID 2>/dev/null || true
          fi

          exit 1

      - name: Run E2E tests
        # Playwright automatically starts the Vite frontend via webServer config
        # (see apps/ui/playwright.config.ts) - no need to start it manually
        run: npm run test --workspace=apps/ui
        env:
          CI: true
          VITE_SERVER_URL: http://localhost:3008
          VITE_SKIP_SETUP: 'true'
          # Keep UI-side login/defaults consistent
          AUTOMAKER_API_KEY: test-api-key-for-e2e-tests

      - name: Print backend logs on failure
        if: failure()
        run: |
          echo "=== E2E Tests Failed - Backend Logs ==="
          cat backend.log 2>/dev/null || echo "No backend log found"
          echo ""
          echo "=== Process status at failure ==="
          ps aux | grep -E "(node|tsx)" | grep -v grep || echo "No node processes found"
          echo ""
          echo "=== Port status ==="
          netstat -tlnp 2>/dev/null | grep :3008 || echo "Port 3008 not listening"

      - name: Upload Playwright report
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: playwright-report
          path: apps/ui/playwright-report/
          retention-days: 7

      - name: Upload test results (screenshots, traces, videos)
        uses: actions/upload-artifact@v4
        if: always()
        with:
          name: test-results
          path: |
            apps/ui/test-results/
          retention-days: 7
          if-no-files-found: ignore

      - name: Cleanup - Kill backend server
        if: always()
        run: |
          if [ -n "$SERVER_PID" ]; then
            echo "Cleaning up backend server (PID: $SERVER_PID)..."
            kill $SERVER_PID 2>/dev/null || true
            kill -9 $SERVER_PID 2>/dev/null || true
            echo "Backend server cleanup complete"
          fi
