name: Docker Deploy Test

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

concurrency:
  group: deploy-test-${{ github.ref }}
  cancel-in-progress: true

jobs:
  docker-deploy-test:
    name: Fresh-Linux Docker Deploy
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Create minimal .env
        run: |
          cat <<'EOF' > .env
          NEXTAUTH_URL=http://localhost:3100
          NEXTAUTH_SECRET=ci-test-secret-minimum-32-chars-xx
          PGADMIN_PASSWORD=ci-pgadmin
          EOF

      - name: Start infrastructure (postgres + redis)
        run: docker compose up -d postgres redis

      - name: Wait for postgres
        run: |
          for i in $(seq 1 20); do
            docker compose exec -T postgres pg_isready -U capakraken -d capakraken && break
            sleep 3
          done

      - name: Build and start app (full profile)
        run: docker compose --profile full up -d --build app

      - name: Wait for /api/health (up to 3 minutes)
        run: |
          for i in $(seq 1 36); do
            STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:3100/api/health || echo "000")
            echo "Attempt $i: HTTP $STATUS"
            if [ "$STATUS" = "200" ]; then exit 0; fi
            sleep 5
          done
          echo "Health check timed out"
          docker compose logs app --tail=50
          exit 1

      - name: Verify health response contains status ok
        run: |
          BODY=$(curl -sf http://localhost:3100/api/health)
          echo "$BODY"
          echo "$BODY" | grep '"status":"ok"'

      - name: Seed admin user
        run: |
          docker compose exec -T app node /app/scripts/setup-admin.mjs \
            --email admin@capakraken.dev \
            --name "Admin" \
            --password admin123

      - name: Set up Node.js 20
        uses: actions/setup-node@v4
        with:
          node-version: "20"

      - name: Install Playwright and Chromium
        run: |
          npm install -g @playwright/test@1.49
          playwright install chromium --with-deps

      - name: Run smoke tests
        run: npx playwright test --config apps/web/playwright.ci.config.ts

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

      - name: Show logs on failure
        if: failure()
        run: docker compose logs --tail=100
