name: Website
on:
    pull_request: {}
    push:
        branches:
            - main

concurrency:
    group: ${{ github.workflow }}-${{ github.ref }}
    cancel-in-progress: false

jobs:
    book-test:
        name: Test Book
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v4

            - name: Set up Rust toolchain
              run: |
                  rustup toolchain install stable --no-self-update --profile minimal
                  rustup target add wasm32-unknown-unknown

            - name: Set up Rust cache
              uses: swatinem/rust-cache@v2
              with:
                  cache-on-failure: true
                  save-if: ${{ github.ref == 'refs/heads/main' }}

            - name: Install Cargo Binary Install
              uses: cargo-bins/cargo-binstall@main

            - name: Install mdBook
              run: cargo binstall --force -y mdbook mdbook-tabs mdbook-trunk

            - name: Run tests
              run: mdbook test
              working-directory: book

    book-build:
        name: Build Book
        needs: book-test
        runs-on: ubuntu-latest
        steps:
            - uses: actions/checkout@v4
              with:
                  fetch-depth: 0

            - name: Set up Rust toolchain
              run: |
                  rustup toolchain install stable --no-self-update --profile minimal
                  rustup target add wasm32-unknown-unknown

            - name: Set up Rust cache
              uses: swatinem/rust-cache@v2
              with:
                  cache-on-failure: true
                  save-if: ${{ github.ref == 'refs/heads/main' }}

            - name: Install Cargo Binary Install
              uses: cargo-bins/cargo-binstall@main

            - name: Install mdBook and Trunk
              run: cargo binstall --force -y mdbook mdbook-tabs mdbook-trunk trunk

            - name: Install Node.js dependencies
              run: npm install

            - name: Build Book
              run: mdbook build
              working-directory: book

            - name: Combine Book Outputs
              run: mdbook-trunk combine
              working-directory: book

            - name: Upload artifact
              uses: actions/upload-artifact@v4
              with:
                  name: book
                  path: book/dist
                  retention-days: 1
                  if-no-files-found: error

    deploy:
        name: Deploy
        needs: book-build
        if: github.ref == 'refs/heads/main'
        runs-on: ubuntu-latest
        permissions:
            contents: read
            pages: write
            id-token: write
        steps:
            - uses: actions/checkout@v4
              with:
                  fetch-depth: 0

            - name: Download artifacts
              uses: actions/download-artifact@v4
              with:
                  path: dist
                  merge-multiple: true

            - name: Setup Pages
              uses: actions/configure-pages@v5

            - name: Upload artifact
              uses: actions/upload-pages-artifact@v3
              with:
                  path: dist

            - name: Deploy to GitHub Pages
              id: deployment
              uses: actions/deploy-pages@v4
