name: deploy-demo (manual re-deploy)

# MANUAL re-deploy of demo.pcbjam.com WITHOUT rebuilding/publishing WASM — it
# snapshots the WASM already in the registry into manifest-<tag>.json, publishes
# the gallery, builds the standalone, and deploys. Use it to re-ship the demo for
# an existing tag (e.g. a Pages config fix) when the WASM is already published.
#
# The tag-triggered release pipeline lives in release.yml (build -O2 → publish
# WASM → deploy), so a tag NO LONGER triggers this — this is the manual escape
# hatch only. If the registry has no WASM for the tag, the snapshot step fails
# (run release.yml, which builds + publishes). See docs/features/demo-deploy/.
on:
  workflow_dispatch:
    inputs:
      tag:
        description: "Release tag to re-deploy, e.g. v1.2.3 (WASM must already be published)"
        required: true

# Serialize demo deploys so two tags don't race the live site (don't cancel a
# half-finished deploy — let it complete).
concurrency:
  group: deploy-demo
  cancel-in-progress: false

env:
  CDN: https://cdn.pcbjam.com
  BUCKET: pcbjam-cdn
  # KiCad library snapshot the demo points at (published once by publish-libs.yml
  # to libs/kicad/<LIB_TAG>/). Bump when moving to a newer KiCad library release.
  LIB_TAG: "10.0.3"
  # kicad-packages3D snapshot the demo's lazy 3D models point at (published once
  # to libs/kicad-models/<MODELS_TAG>/ — see scripts/deploy/publish-models.ts +
  # upload-models-r2.sh; docs/features/3d-models). Empty ⇒ 3D models off.
  MODELS_TAG: "10.0.3"
  PAGES_PROJECT: pcbjam-demo
  # MUST be the Pages project's PRODUCTION branch — any other value makes
  # `wrangler pages deploy` a PREVIEW deploy and demo.pcbjam.com won't update.
  # Direct-Upload projects default to "production".
  PAGES_PROD_BRANCH: production
  # Better Stack error-tracking DSN. Unset ⇒ this build reports nothing.
  # Keep in sync with release.yml — the demo is built from BOTH workflows, and
  # setting it in only one silently ships a demo with no error reporting.
  ERRORS_DSN: ${{ secrets.ERRORS_DSN }}
  CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
  CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
  # The publish scripts shell wrangler; no repo dep — fetch it on demand.
  WRANGLER_CMD: npx --yes wrangler@4

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      # The standalone needs the MIT pcbjam-shared submodule, but NOT the huge
      # kicad/wxwidgets ones (WASM is prebuilt on the CDN, not built here).
      - uses: actions/checkout@v4
        with:
          submodules: false
      - name: Init pcbjam-shared submodule
        run: git submodule update --init --depth 1 web/pcbjam-shared

      # Pin pnpm explicitly: the repo root has no package.json, so action-setup
      # can't infer the version from a packageManager field (it lives in
      # web/package.json). Keep in sync with web/package.json's packageManager.
      - uses: pnpm/action-setup@v4
        with:
          version: 10.33.0
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: pnpm
          cache-dependency-path: web/pnpm-lock.yaml

      - name: Install standalone workspace
        run: pnpm --dir web install --frozen-lockfile

      - name: Resolve tag
        id: tag
        # On workflow_dispatch GITHUB_REF_NAME is the branch (e.g. main), so prefer
        # the explicit input; on a tag push the input is empty and ref_name is the tag.
        run: echo "tag=${{ github.event.inputs.tag || github.ref_name }}" >> "$GITHUB_OUTPUT"

      # 1) Reuse prebuilt WASM: snapshot the current registry into manifest-<tag>
      #    (no build, no upload). Fails if the WASM was never published — run
      #    publish-wasm.yml (or a local seed) first.
      - name: Snapshot WASM manifest
        run: >
          node scripts/deploy/publish-wasm.mjs --tag "${{ steps.tag.outputs.tag }}"
          --driver r2 --bucket "$BUCKET" --remote --from-registry

      # 2) Publish the read-only example gallery (tiny; content/<tag>/).
      - name: Publish content gallery
        run: >
          node scripts/deploy/publish-content.mjs --tag "${{ steps.tag.outputs.tag }}"
          --gallery deploy/demo/gallery.json --driver r2 --bucket "$BUCKET" --remote

      # 3) Build the standalone pinned to the CDN + this tag's manifests. The
      #    full KiCad library set is served read-only from libs/kicad/$LIB_TAG
      #    (published once by publish-libs.yml — run it first for a new lib tag).
      - name: Build demo
        # Plausible: the shared pa- script covering all pcbjam properties
        # (one dashboard, segment by hostname).
        run: >
          node scripts/deploy/build-demo.mjs --tag "${{ steps.tag.outputs.tag }}"
          --cdn "$CDN" --lib-tag "$LIB_TAG"
          ${MODELS_TAG:+--models-tag "$MODELS_TAG"}
          --plausible "https://plausible.io/js/pa-KjNS9YmidydULZTstsjRg.js"
          ${ERRORS_DSN:+--errors-dsn "$ERRORS_DSN" --errors-env demo}

      # 4) Ensure the Pages project exists (first deploy creates it; no-op after).
      #    Its production branch must equal PAGES_PROD_BRANCH or deploys land as
      #    previews and demo.pcbjam.com won't update.
      - name: Ensure Pages project exists
        run: >
          npx --yes wrangler@4 pages project create "$PAGES_PROJECT"
          --production-branch "$PAGES_PROD_BRANCH"
          || echo "pages project create skipped (already exists)"

      # 5) Deploy to Cloudflare Pages. Attach demo.pcbjam.com to this project
      #    (Pages → $PAGES_PROJECT → Custom domains) for the custom domain to serve it.
      - name: Deploy to Cloudflare Pages
        run: >
          npx --yes wrangler@4 pages deploy web/standalone/dist
          --project-name "$PAGES_PROJECT"
          --branch "$PAGES_PROD_BRANCH"
          --commit-dirty=true
