name: Build

concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
  cancel-in-progress: true

on:
  push:
    branches: [ master, release* ]
  pull_request_target:
    branches: [ master, release* ]
  workflow_dispatch:

jobs:
  run-build-prod:
    name: Run production build
    runs-on: ubuntu-latest

    steps:
      - name: Check out Git repository
        uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7
        with:
          ref: ${{ github.event.pull_request.head.sha || github.sha }}

      - name: Setup node environment
        uses: actions/setup-node@1e60f620b9541d16bece96c5465dc8ee9832be0b # v4.0.3
        with:
          node-version: 20
          check-latest: true
          cache: npm

      - name: Install Node.js dependencies
        run: npm ci --no-audit

      - name: Run a production build
        env:
          JELLYFIN_VERSION: ${{ github.event.pull_request.head.sha || github.sha }}
        run: npm run build:production

      - name: Update config.json for testing
        run: |
          jq '.multiserver=true | .servers=["https://demo.jellyfin.org/unstable"]' dist/config.json > dist/config.tmp.json
          mv dist/config.tmp.json dist/config.json

      - name: Upload artifact
        uses: actions/upload-artifact@50769540e7f4bd5e21e526ee35c689e35e0d6874 # v4.4.0
        with:
          name: jellyfin-web__prod
          path: dist

  publish:
    name: Deploy to Cloudflare Pages
    runs-on: ubuntu-latest
    if: ${{ github.repository == 'jellyfin/jellyfin-web' }}
    needs:
      - run-build-prod
    permissions:
      contents: read
      deployments: write

    steps:
      - name: Add comment
        uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0
        if: ${{ github.event_name == 'pull_request_target' }}
        with:
          GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
          message: |
            ## Cloudflare Pages deployment

            | **Latest commit** | <code>${{ github.event.pull_request.head.sha || github.sha }}</code> |
            |-------------------|:-:|
            | **Status**        | 🔄 Deploying... |
            | **Preview URL**   | Not available |
            | **Type**          | 🔀 Preview |
          pr_number: ${{ github.event.pull_request.number }}
          comment_tag: CFPages-deployment
          mode: recreate

      - name: Download workflow artifact
        uses: dawidd6/action-download-artifact@09f2f74827fd3a8607589e5ad7f9398816f540fe # v3.1.4
        with:
          name: jellyfin-web__prod
          path: dist

      - name: Publish to Cloudflare
        id: cf
        uses: cloudflare/wrangler-action@f84a562284fc78278ff9052435d9526f9c718361 # v3.7.0
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          command: pages deploy dist --project-name=jellyfin-web --branch=${{
                  (github.event_name != 'pull_request_target' || github.event.pull_request.head.repo.full_name == github.repository)
                  && (github.event.pull_request.head.ref || github.ref_name)
                  || format('{0}/{1}', github.event.pull_request.head.repo.full_name, github.event.pull_request.head.ref)
                }} --commit-hash=${{ github.event.pull_request.head.sha || github.sha }}

      - name: Update status comment (Success)
        if: ${{ github.event_name == 'pull_request_target' && success() }}
        uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0
        with:
          GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
          message: |
            ## Cloudflare Pages deployment

            | **Latest commit** | <code>${{ github.event.pull_request.head.sha || github.sha }}</code> |
            |-------------------|:-:|
            | **Status**        | ✅ Deployed! |
            | **Preview URL**   | ${{ steps.cf.outputs.deployment-url != '' && steps.cf.outputs.deployment-url || 'Not available' }} |
            | **Type**          | 🔀 Preview |
          pr_number: ${{ github.event.pull_request.number }}
          comment_tag: CFPages-deployment
          mode: recreate

      - name: Update status comment (Failure)
        if: ${{ github.event_name == 'pull_request_target' && failure() }}
        uses: thollander/actions-comment-pull-request@fabd468d3a1a0b97feee5f6b9e499eab0dd903f6 # v2.5.0
        with:
          GITHUB_TOKEN: ${{ secrets.JF_BOT_TOKEN }}
          message: |
            ## Cloudflare Pages deployment

            | **Latest commit** | <code>${{ github.event.pull_request.head.sha || github.sha }}</code> |
            |-------------------|:-:|
            | **Status**        | ❌ Failure. Check workflow logs for details |
            | **Preview URL**   | Not available |
            | **Type**          | 🔀 Preview |
          pr_number: ${{ github.event.pull_request.number }}
          comment_tag: CFPages-deployment
          mode: recreate
