name: Deploy preview for PR

on:
  pull_request:

jobs:
  add_label:
    runs-on: ubuntu-latest
    outputs:
      has_label: ${{ steps.check-labels.outputs.result }}
    steps:
    - name: Check if label is present
      id: check-labels
      uses: actions/github-script@v7.0.1
      with:
        github-token: ${{ secrets.GITHUB_TOKEN }}
        script: |
          const labels = context.payload.pull_request.labels.map(label => label.name);
          if (labels.includes('documentation')) {
            return true;
          }

          // Fetch the list of files changed in the PR
          const { data: files } = await github.rest.pulls.listFiles({
            owner: context.repo.owner,
            repo: context.repo.repo,
            pull_number: context.issue.number,
            per_page: 100
          });

          // Check if any file is within the 'docs' folder
          const docsChanged = files.some(file => file.filename.startsWith('docs/'));
          return docsChanged;
    
    - name: Add label if not present
      if: steps.check-labels.outputs.result == 'true'
      uses: actions/github-script@v7.0.1
      with:
        github-token: ${{ secrets.GITHUB_TOKEN }}
        script: |
          const labels = context.payload.pull_request.labels.map(label => label.name);
          if (!labels.includes('documentation')) {
            github.rest.issues.addLabels({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              labels: ['documentation']
            })
          }

  build_preview:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup toolchain
        uses: dtolnay/rust-toolchain@1.73.0

      - uses: Swatinem/rust-cache@v2
        with:
          key: x86_64-unknown-linux-gnu
          cache-on-failure: false
          save-if: false

      - name: Install Yarn dependencies
        uses: ./.github/actions/setup

      - name: Install wasm-bindgen-cli
        uses: taiki-e/install-action@v2
        with:
          tool: wasm-bindgen-cli@0.2.86

      - name: Install wasm-opt
        run: |
          npm i wasm-opt -g

      - name: Build docs
        run: 
          yarn workspaces foreach -Rpt --from docs run build

      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: docs
          path: ./docs/build/
          retention-days: 3


  deploy_preview:
    needs: [build_preview, add_label]
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
    if: needs.add_label.outputs.has_label == 'true'
    steps:
      - name: Checkout code
        uses: actions/checkout@v4
    
      - name: Download built docs
        uses: actions/download-artifact@v4
        with:
          name: docs
          path: ./docs/build
     
      - name: Deploy to Netlify
        uses: nwtgck/actions-netlify@v2.1
        with:
          publish-dir: './docs/build'
          github-token: ${{ secrets.GITHUB_TOKEN }}
          enable-github-deployment: false
          deploy-message: "Deploy from GitHub Actions for PR ${{ github.event.number }}"
        env:
          NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
          NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
        timeout-minutes: 1

  add_comment:
    needs: [deploy_preview]
    runs-on: ubuntu-latest
    permissions:
      pull-requests: write
    steps:
      - name: Tag dev rel in comment
        uses: marocchino/sticky-pull-request-comment@v2
        with:
          message: |
            FYI @noir-lang/developerrelations on Noir doc changes.
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}