name: "CI"

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main
  workflow_dispatch:
  schedule:
    # First day of a month
    - cron: '0 0 1 * *'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - name: Get Core Sans
        uses: actions/checkout@v4
        if: "!github.event.pull_request.head.repo.fork"
        with:
          fetch-depth: 0
          repository: mainmatter/core-sans-a-fonts
          ssh-key: ${{ secrets.SSH_PRIVATE_KEY }}
          path: core-sans-a-fonts
      - name: Install Core Sans Font
        if: "!github.event.pull_request.head.repo.fork"
        run: |
          sudo cp -r core-sans-a-fonts/* /usr/local/share/fonts/
          sudo fc-cache -f -v
          fc-list | grep "Core Sans"
      - name: Use Fallback font for fork PRs
        if: "github.event.pull_request.head.repo.fork"
        run: |
          sed -i 's/"BoldFont=CoreSansA65.ttf",//g' book/book.toml
          sed -i 's/"ItalicFont=CoreSansA45It.ttf",//g' book/book.toml
          sed -i 's/"BoldItalicFont=CoreSansA65It.ttf",//g' book/book.toml
          sed -i 's/CoreSansA45.ttf/Open Sans:style=Regular/g' book/book.toml
      - uses: actions-rust-lang/setup-rust-toolchain@v1
      - name: Install exercise plugin
        run: cargo install --path helpers/mdbook-exercise-linker
      - name: Install link shortener plugin
        run: cargo install --path helpers/mdbook-link-shortener
      - name: Install mdbook-pandoc, calibre, pdftk and related dependencies
        run: |
          cargo install mdbook-pandoc --locked --version 0.7.1
          sudo apt-get update
          sudo apt-get install -y fonts-noto fonts-open-sans calibre pdftk
          sudo fc-cache -f -v
          export PANDOC_VERSION=3.3
          curl -LsSf https://github.com/jgm/pandoc/releases/download/${PANDOC_VERSION}/pandoc-${PANDOC_VERSION}-linux-amd64.tar.gz | tar zxf -
          echo "$PWD/pandoc-${PANDOC_VERSION}/bin" >> $GITHUB_PATH
        shell: bash
      - name: Setup TeX Live
        uses: teatimeguest/setup-texlive-action@v3
        with:
          packages:
            scheme-basic
            luatex
            lualatex-math
            luacolor
            luatexbase
            luaotfload
            framed
            unicode-math
            xcolor
            geometry
            longtable
            booktabs
            array
            lua-ul
            etoolbox
            fancyvrb
            footnote
            selnolig
            natbib
            csquotes
            bookmark
            xurl
            amsmath
            setspace
            iftex
      - name: Check `tlmgr` version
        run: tlmgr --version
      - uses: taiki-e/install-action@v2
        with:
          tool: mdbook
      - name: Build book
        env:
          LINK_SHORTENER_VERIFY: "true"
        run: |
          cd book
          mdbook build
      - name: Add cover and back to downloadable PDF
        run: |
          pdftk book/assets/cover.pdf book/book/pandoc/pdf/100-exercises-to-learn-rust.pdf book/assets/back.pdf cat output book/book/pandoc/pdf/100-exercises-to-learn-rust-with-cover.pdf
          mv book/book/pandoc/pdf/100-exercises-to-learn-rust-with-cover.pdf book/book/pandoc/pdf/100-exercises-to-learn-rust.pdf
      - name: Convert HTML to ePUB
        run: |
          cd book/book/pandoc/html
          sed -i 's|<code>\\newpage</code>{=latex}||g' 100-exercises-to-learn-rust.html
          ebook-convert 100-exercises-to-learn-rust.html 100-exercises-to-learn-rust.epub \
            --embed-all-fonts \
            --subset-embedded-fonts
      - name: Link Checker
        uses: lycheeverse/lychee-action@v1
        with:
          fail: true
          args: |
            --exclude-loopback 
            --require-https 
            --no-progress 
            book/book/html/
      # Upload the HTML book as an artifact
      - uses: actions/upload-artifact@v4
        with:
          name: book
          # When you support multiple formats, the output directory changes
          # to include the format in its path.
          path: book/book/html
      - uses: actions/upload-artifact@v4
        with:
          name: online-pdf
          path: book/book/pandoc/pdf/100-exercises-to-learn-rust.pdf
      - uses: actions/upload-artifact@v4
        with:
          name: paperback
          path: book/book/pandoc/paperback/100-exercises-to-learn-rust.pdf
      - uses: actions/upload-artifact@v4
        with:
          name: ePUB
          path: book/book/pandoc/html/100-exercises-to-learn-rust.epub

  is_fresh:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: sudo apt-get update && sudo apt-get install -y jq
      - run: |
          ./helpers/json2redirects.sh book/link2alias.json > site/_redirects
      # Verify nothing has changed, meaning that the redirect file is up-to-date
      - run: |
          git diff --exit-code site/_redirects

  gravity:
    runs-on: ubuntu-latest
    needs: [build]
    steps:
      - uses: actions/download-artifact@v4
        with:
          path: book
          pattern: online-pdf
      - uses: pnpm/action-setup@v4
        with:
          version: 9
      - run: ls -las ./book
      - name: Run Gravity
        run: pnpm dlx @gravityci/cli "./book/**/*"
        env:
          GRAVITY_TOKEN: ${{ secrets.GRAVITY_TOKEN }}

  formatter:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: dprint/check@v2.2