name: Release Smoke

on:
  workflow_dispatch:
    inputs:
      paperclip_version:
        description: Published Paperclip dist-tag to test
        required: true
        default: canary
        type: choice
        options:
          - canary
          - latest
      host_port:
        description: Host port for the Docker smoke container
        required: false
        default: "3232"
        type: string
      artifact_name:
        description: Artifact name for uploaded diagnostics
        required: false
        default: release-smoke
        type: string
  workflow_call:
    inputs:
      paperclip_version:
        required: true
        type: string
      host_port:
        required: false
        default: "3232"
        type: string
      artifact_name:
        required: false
        default: release-smoke
        type: string

jobs:
  smoke:
    runs-on: ubuntu-latest
    timeout-minutes: 45

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

      - name: Setup pnpm
        uses: pnpm/action-setup@v4
        with:
          version: 9.15.4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 24
          cache: pnpm

      - name: Install dependencies
        run: pnpm install --no-frozen-lockfile

      - name: Install Playwright browser
        run: npx playwright install --with-deps chromium

      - name: Launch Docker smoke harness
        run: |
          metadata_file="$RUNNER_TEMP/release-smoke.env"
          HOST_PORT="${{ inputs.host_port }}" \
          DATA_DIR="$RUNNER_TEMP/release-smoke-data" \
          PAPERCLIPAI_VERSION="${{ inputs.paperclip_version }}" \
          SMOKE_DETACH=true \
          SMOKE_METADATA_FILE="$metadata_file" \
          ./scripts/docker-onboard-smoke.sh
          set -a
          source "$metadata_file"
          set +a
          {
            echo "SMOKE_BASE_URL=$SMOKE_BASE_URL"
            echo "SMOKE_ADMIN_EMAIL=$SMOKE_ADMIN_EMAIL"
            echo "SMOKE_ADMIN_PASSWORD=$SMOKE_ADMIN_PASSWORD"
            echo "SMOKE_CONTAINER_NAME=$SMOKE_CONTAINER_NAME"
            echo "SMOKE_DATA_DIR=$SMOKE_DATA_DIR"
            echo "SMOKE_IMAGE_NAME=$SMOKE_IMAGE_NAME"
            echo "SMOKE_PAPERCLIPAI_VERSION=$SMOKE_PAPERCLIPAI_VERSION"
            echo "SMOKE_METADATA_FILE=$metadata_file"
          } >> "$GITHUB_ENV"

      - name: Run release smoke Playwright suite
        env:
          PAPERCLIP_RELEASE_SMOKE_BASE_URL: ${{ env.SMOKE_BASE_URL }}
          PAPERCLIP_RELEASE_SMOKE_EMAIL: ${{ env.SMOKE_ADMIN_EMAIL }}
          PAPERCLIP_RELEASE_SMOKE_PASSWORD: ${{ env.SMOKE_ADMIN_PASSWORD }}
        run: pnpm run test:release-smoke

      - name: Capture Docker logs
        if: always()
        run: |
          if [[ -n "${SMOKE_CONTAINER_NAME:-}" ]]; then
            docker logs "$SMOKE_CONTAINER_NAME" >"$RUNNER_TEMP/docker-onboard-smoke.log" 2>&1 || true
          fi

      - name: Upload diagnostics
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: ${{ inputs.artifact_name }}
          path: |
            ${{ runner.temp }}/docker-onboard-smoke.log
            ${{ env.SMOKE_METADATA_FILE }}
            tests/release-smoke/playwright-report/
            tests/release-smoke/test-results/
          retention-days: 14

      - name: Stop Docker smoke container
        if: always()
        run: |
          if [[ -n "${SMOKE_CONTAINER_NAME:-}" ]]; then
            docker rm -f "$SMOKE_CONTAINER_NAME" >/dev/null 2>&1 || true
          fi
