name: CI
on:
  pull_request:
  push:
    branches: [main]

# Sets permissions of the GITHUB_TOKEN to allow deployment to GitHub Pages
permissions:
  contents: read
  pages: write
  id-token: write
  checks: write

jobs:
  ci:
    name: CI
    needs: [test, clippy, docs]
    runs-on: ubuntu-latest
    steps:
      - name: Done
        run: exit 0
  test:
    name: Tests
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest]
        rust: [1.92.0, nightly]
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v3
      - name: Install rust
        uses: dtolnay/rust-toolchain@master
        with:
          toolchain: ${{ matrix.rust }}
      - name: Ready cache
        if: matrix.os == 'ubuntu-latest'
        run: sudo chown -R $(whoami):$(id -ng) ~/.cargo/
      - name: Install dependencies
        run: sudo apt-get update; sudo apt-get install --no-install-recommends libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libudev-dev
      - name: Cache cargo
        uses: actions/cache@v4
        id: cache
        with:
          path: ~/.cargo
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Test
        run: cargo test --verbose --all-features --features bevy/bevy_gltf -- --nocapture
  fmt:
   name: Rustfmt
   runs-on: ubuntu-latest
   steps:
     - uses: actions/checkout@v3
     - uses: dtolnay/rust-toolchain@master
       with:
         toolchain: 1.92.0
         components: rustfmt
     - name: Run fmt --all -- --check
       run: cargo fmt --all -- --check

  clippy:
    name: Clippy
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: 1.92.0
          components: clippy
      - name: Install dependencies
        run: sudo apt-get update; sudo apt-get install --no-install-recommends libudev-dev
      - name: Cache cargo
        uses: actions/cache@v4
        id: cache
        with:
          path: ~/.cargo
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Run clippy --all-targets --
        uses: actions-rs/clippy-check@v1
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          args: --all-targets --
  docs:
    name: Docs
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: 1.92.0
      - name: Install dependencies
        run: sudo apt-get update; sudo apt-get install --no-install-recommends libudev-dev
      - name: Cache cargo
        uses: actions/cache@v4
        id: cache
        with:
          path: ~/.cargo
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
      - name: Run doc tests
        run: cargo test --doc --all-features --features bevy/bevy_gltf
      - name: Check docs
        run: cargo doc --no-deps --all-features --features bevy/x11
  docs-and-demos-ghpages:
    name: Update Docs and Demos in GitHub Pages
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v3
      - uses: jetli/wasm-bindgen-action@v0.2.0
        with:
          version: 'latest'
      - uses: dtolnay/rust-toolchain@master
        with:
          targets: wasm32-unknown-unknown
          toolchain: 1.92.0
      - name: Build docs
        env:
          GITHUB_REPO: ${{ github.repository }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |-
          cargo doc --no-deps --verbose --all-features --features bevy/webgl2,bevy/x11 &&
          echo "<meta http-equiv=refresh content=0;url=bevy_yoleck/index.html>" > target/doc/index.html
          required_features=$(
            (
              cargo metadata --no-deps --format-version 1 \
                  | jq '.packages[].targets[] | select(.kind == ["example"]) | .["required-features"][]' -r
              echo bevy/webgl2
              echo bevy/x11
            ) | tr '\n' ' '
          )
          RUSTFLAGS='--cfg getrandom_backend="wasm_js"' cargo build --examples --release --features "$required_features" --target wasm32-unknown-unknown
          for demowasm in $(cd target/wasm32-unknown-unknown/release/examples; ls *.wasm | grep -v -); do
              wasm-bindgen target/wasm32-unknown-unknown/release/examples/$demowasm --out-dir target/doc/demos/ --target web
              cat > target/doc/demos/${demowasm%.*}.html <<EOF
          <html lang="en-us">
              <head>
                  <script type="module">
                      import init from './${demowasm%.*}.js';
                      var res = await init();
                      res.start();
                  </script>
              </head>
              <body>
                  <script>
                      document.body.addEventListener("contextmenu", (e) => {
                          e.preventDefault();
                          e.stopPropagation();
                      });
                  </script>
              </body>
          </html>
          EOF
          done
          cp -R assets/ target/doc/demos/
      - name: Add read permissions
        run: |-
          chmod --recursive +r target/doc
      - name: Upload artifact
        uses: actions/upload-pages-artifact@v3
        with:
          path: target/doc
  deploy-ghpages:
    environment:
      name: github-pages
      url: ${{ steps.deployment.outputs.page_url }}
    runs-on: ubuntu-latest
    needs: docs-and-demos-ghpages
    if: github.ref == 'refs/heads/main'
    steps:
      - name: Deploy to GitHub Pages
        id: deployment
        uses: actions/deploy-pages@v4
