name: Bindings

on: [push, pull_request]

jobs:
  test-windows:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@main
      - name: test_win
        run: |
          cd tests
          test_win.cmd
        shell: cmd

  test-mac:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@main
      - uses: seanmiddleditch/gha-setup-ninja@master
      - name: test_macos
        run: |
          cd tests
          ./test_macos.sh

  test-linux:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@main
      - uses: seanmiddleditch/gha-setup-ninja@master
      - name: prepare
        run: |
          sudo apt-get update
          sudo apt-get install libgl1-mesa-dev libegl1-mesa-dev mesa-common-dev xorg-dev libasound-dev libvulkan-dev
      - name: test_linux
        run: |
          cd tests
          ./test_linux.sh

  gen-bindings:
    needs: [ test-windows, test-mac, test-linux ]
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@main
      - uses: actions/checkout@main
        with:
          repository: floooh/sokol-zig
          path: bindgen/sokol-zig
      - uses: actions/checkout@main
        with:
          repository: floooh/sokol-nim
          path: bindgen/sokol-nim
      - uses: actions/checkout@main
        with:
          repository: floooh/sokol-odin
          path: bindgen/sokol-odin
      - uses: actions/checkout@main
        with:
          repository: floooh/sokol-rust
          path: bindgen/sokol-rust
      - uses: actions/checkout@main
        with:
          repository: floooh/sokol-d
          path: bindgen/sokol-d
      - uses: actions/checkout@main
        with:
          repository: colinbellino/sokol-jai
          path: bindgen/sokol-jai
      - uses: actions/checkout@main
        with:
          repository: floooh/sokol-c3
          path: bindgen/sokol-c3
      - name: generate
        run: |
          cd bindgen
          python3 gen_all.py
      - name: upload-zig-artifact
        uses: actions/upload-artifact@main
        with:
          name: ignore-me-zig
          retention-days: 1
          path: bindgen/sokol-zig/src/sokol
      - name: upload-nim-artifact
        uses: actions/upload-artifact@main
        with:
          name: ignore-me-nim
          retention-days: 1
          path: bindgen/sokol-nim/src/sokol
      - name: upload-odin-artifact
        uses: actions/upload-artifact@main
        with:
          name: ignore-me-odin
          retention-days: 1
          path: |
            bindgen/sokol-odin/sokol
            bindgen/sokol-odin/c
      - name: upload-rust-artifact
        uses: actions/upload-artifact@main
        with:
          name: ignore-me-rust
          retention-days: 1
          path: bindgen/sokol-rust/src
      - name: upload-d-artifact
        uses: actions/upload-artifact@main
        with:
          name: ignore-me-d
          retention-days: 1
          path: bindgen/sokol-d/src/sokol
      - name: upload-jai-artifact
        uses: actions/upload-artifact@main
        with:
          name: ignore-me-jai
          retention-days: 1
          path: bindgen/sokol-jai/sokol
      - name: upload-c3-artifact
        uses: actions/upload-artifact@main
        with:
          name: ignore-me-c3
          retention-days: 1
          path: bindgen/sokol-c3/sokol.c3l

  test-zig:
    needs: gen-bindings
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    runs-on: ${{matrix.os}}
    steps:
      - uses: actions/checkout@main
        with:
          repository: floooh/sokol-zig
      - uses: mlugg/setup-zig@v2
        with:
          version: 0.15.2
      - uses: actions/download-artifact@main
        with:
          name: ignore-me-zig
          path: src/sokol
      - name: prepare
        if: runner.os == 'Linux'
        run: |
            sudo apt-get update
            sudo apt-get install libgl1-mesa-dev libegl1-mesa-dev mesa-common-dev xorg-dev libasound-dev
      - name: build
        run: zig build examples

  test-nim:
    needs: gen-bindings
    strategy:
      fail-fast: false
      matrix:
        # os: [ubuntu-latest, macos-latest, windows-latest]
        os: [ubuntu-latest, macos-latest]
    runs-on: ${{matrix.os}}
    steps:
      - if: runner.os == 'Linux'
        name: prepare
        run: |
            sudo apt-get update
            sudo apt-get install libglu1-mesa-dev mesa-common-dev xorg-dev libasound-dev
      - uses: actions/checkout@main
        with:
          repository: floooh/sokol-nim
      - uses: actions/download-artifact@main
        with:
          name: ignore-me-nim
          path: src/sokol
      - uses: jiro4989/setup-nim-action@v2
        with:
         nim-version: '2.0.x'
         repo-token: ${{ secrets.GITHUB_TOKEN }}
      - name: build
        run: |
          nimble install -Y
          nimble build_all

  test-odin:
    needs: gen-bindings
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    runs-on: ${{matrix.os}}
    steps:
      - uses: actions/checkout@main
        with:
          repository: floooh/sokol-odin
      - uses: actions/download-artifact@main
        with:
          name: ignore-me-odin
      # NOTE: see https://github.com/floooh/sokol-odin/blob/main/.github/workflows/main.yml
      - uses: ilammy/msvc-dev-cmd@v1
      - if: runner.os == 'Linux'
        name: prepare-linux
        run: |
          sudo apt-get update
          sudo apt-get install libglu1-mesa-dev mesa-common-dev xorg-dev libasound-dev
          wget https://apt.llvm.org/llvm.sh
          chmod +x llvm.sh
          echo "/usr/lib/llvm-17/bin" >> $GITHUB_PATH
          curl -L https://github.com/odin-lang/Odin/releases/download/dev-2024-04/odin-ubuntu-amd64-dev-2024-04.zip --output odin.zip
          unzip odin.zip
          unzip dist.zip
          rm -r ./dist/examples
          mv ./dist/* ./
          chmod a+x ./odin
          cd sokol
          chmod a+x ./build_clibs_linux.sh
          ./build_clibs_linux.sh
          cd ..
      - if: runner.os == 'macOS'
        name: prepare-macos
        run: |
          brew install llvm@17
          curl -L https://github.com/odin-lang/Odin/releases/download/dev-2024-04/odin-macos-amd64-dev-2024-04.zip --output odin.zip
          unzip odin.zip
          unzip dist.zip
          rm -r ./dist/examples
          mv ./dist/* ./
          chmod a+x ./odin
          cd sokol
          chmod a+x ./build_clibs_macos.sh
          ./build_clibs_macos.sh
          cd ..
      - if: runner.os == 'Windows'
        name: prepare-windows
        shell: cmd
        run: |
          curl -L https://github.com/odin-lang/Odin/releases/download/dev-2024-04/odin-windows-amd64-dev-2024-04.zip --output odin.zip
          unzip odin.zip
          cd sokol
          build_clibs_windows.cmd
          cd ..
      - name: build
        run: |
          ./odin build examples/clear -debug
          ./odin build examples/triangle -debug
          ./odin build examples/quad -debug
          ./odin build examples/bufferoffsets -debug
          ./odin build examples/cube -debug
          ./odin build examples/noninterleaved -debug
          ./odin build examples/texcube -debug
          ./odin build examples/shapes -debug
          ./odin build examples/offscreen -debug
          ./odin build examples/instancing -debug
          ./odin build examples/mrt -debug
          ./odin build examples/blend -debug
          ./odin build examples/debugtext -debug
          ./odin build examples/debugtext-print -debug
          ./odin build examples/debugtext-userfont -debug
          ./odin build examples/saudio -debug
          ./odin build examples/sgl -debug
          ./odin build examples/sgl-points -debug
          ./odin build examples/sgl-context -debug

  test-rust:
    needs: gen-bindings
    env:
      CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
    strategy:
      fail-fast: false
      matrix:
        # os: [ubuntu-latest, macos-latest, windows-latest]
        os: [ubuntu-latest, windows-latest]
    runs-on: ${{matrix.os}}
    steps:
      - uses: actions/checkout@main
        with:
          repository: floooh/sokol-rust
      - uses: actions/download-artifact@main
        with:
          name: ignore-me-rust
          path: src
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
      - name: prepare-linux
        if: runner.os == 'Linux'
        run: |
            sudo apt-get update
            sudo apt-get install libglu1-mesa-dev mesa-common-dev xorg-dev libasound-dev
      - name: build
        run: |
            cargo --version
            cargo build --examples --verbose

  test-d:
    needs: gen-bindings
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    runs-on: ${{matrix.os}}
    steps:
      - uses: actions/checkout@main
        with:
          repository: floooh/sokol-d
      - uses: egor-tensin/vs-shell@v2 # get cl.exe (default for Windows)
      - uses: dlang-community/setup-dlang@v2
        with:
          compiler: ldc-master
      - uses: actions/download-artifact@main
        with:
          name: ignore-me-d
          path: src/sokol
      - name: prepare
        if: runner.os == 'Linux'
        run: |
            sudo apt-get update
            sudo apt-get install libgl1-mesa-dev libegl1-mesa-dev mesa-common-dev xorg-dev libasound-dev
      - name: build
        working-directory: examples
        run: |
          dub build :blend
          dub build :bufferoffsets
          dub build :clear
          dub build :cube
          dub build :debugtext
          dub build :droptest
          dub build :imgui
          dub build :instancing
          dub build :instancingcompute
          dub build :mrt
          dub build :noninterleaved
          dub build :nuklear
          dub build :offscreen
          dub build :quad
          dub build :shapes
          dub build :saudio
          dub build :sglcontext
          dub build :sglpoints
          dub build :triangle
          dub build :texcube
          dub build :userdata
          dub build :vertexpull
  test-jai:
    needs: gen-bindings
    strategy:
      matrix:
        os: [ubuntu-latest, macos-latest, windows-latest]
    runs-on: ${{matrix.os}}
    steps:
      - uses: actions/checkout@main
        with:
          repository: colinbellino/sokol-jai
      - uses: actions/download-artifact@v4
        with:
          name: ignore-me-jai
          path: sokol
      - name: prepare
        if: runner.os == 'Linux'
        run: |
            sudo apt-get update
            sudo apt-get install libgl1-mesa-dev libegl1-mesa-dev mesa-common-dev xorg-dev libasound-dev
      - name: build
        run: echo "run jai here"

  test-c3:
    needs: gen-bindings
    strategy:
      # Continue build even if some platforms fail.
      fail-fast: false
      matrix:
        include:
          - os: macos-latest
            arch: arm64
          - os: ubuntu-latest
            arch: x64
          - os: windows-latest
            arch: x64
    runs-on: ${{matrix.os}}
    steps:
      - uses: actions/checkout@main
        with:
          repository: floooh/sokol-c3
      - uses: radekm/setup-c3@v2
        with:
          version: v0.7.8
      - uses: actions/download-artifact@main
        with:
          name: ignore-me-c3
          path: sokol.c3l
      - name: prepare
        if: runner.os == 'Linux'
        run: |
            sudo apt-get update
            sudo apt-get install libgl1-mesa-dev libegl1-mesa-dev mesa-common-dev xorg-dev libasound-dev
      - name: build
        shell: bash
        run: ./build-examples.sh

  # only deploy the bindings for commits on the main branch
  deploy-zig:
    needs: test-zig
    if: github.ref == 'refs/heads/master'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          repository: floooh/sokol-zig
          ssh-key: ${{ secrets.GHACTIONS_ZIG_PUSH }}
      - uses: actions/download-artifact@v4
        with:
          name: ignore-me-zig
          path: src/sokol
      - name: "commit and push"
        run: |
          git config user.email "none"
          git config user.name "GH Action"
          git add -A
          git diff-index --quiet HEAD || git commit -m "updated (https://github.com/floooh/sokol/commit/${{ github.sha }})"
          git push

  deploy-nim:
    needs: test-nim
    if: github.ref == 'refs/heads/master'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          repository: floooh/sokol-nim
          ssh-key: ${{ secrets.GHACTIONS_NIM_PUSH }}
      - uses: actions/download-artifact@v4
        with:
          name: ignore-me-nim
          path: src/sokol
      - name: "commit and push"
        run: |
          git config user.email "none"
          git config user.name "GH Action"
          git add -A
          git diff-index --quiet HEAD || git commit -m "updated (https://github.com/floooh/sokol/commit/${{ github.sha }})"
          git push

  deploy-odin:
    needs: test-odin
    if: github.ref == 'refs/heads/master'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          repository: floooh/sokol-odin
          ssh-key: ${{ secrets.GHACTIONS_ODIN_PUSH }}
      - uses: actions/download-artifact@v4
        with:
          name: ignore-me-odin
      - name: "commit and push"
        run: |
          git config user.email "none"
          git config user.name "GH Action"
          git add -A
          git diff-index --quiet HEAD || git commit -m "updated (https://github.com/floooh/sokol/commit/${{ github.sha }})"
          git push

  deploy-rust:
    needs: test-rust
    env:
      CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse
    if: github.ref == 'refs/heads/master'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          repository: floooh/sokol-rust
          ssh-key: ${{ secrets.GHACTIONS_RUST_PUSH }}
      - uses: actions/download-artifact@v4
        with:
          name: ignore-me-rust
          path: src
      - uses: dtolnay/rust-toolchain@master
        with:
          toolchain: stable
          components: rustfmt
      - name: "cargo fmt"
        run: cargo fmt
      - name: "commit and push"
        run: |
          git config user.email "none"
          git config user.name "GH Action"
          git status -vv
          git add -A
          git diff-index --quiet HEAD || git commit -m "updated (https://github.com/floooh/sokol/commit/${{ github.sha }})"
          git push

  deploy-d:
    needs: test-d
    if: github.ref == 'refs/heads/master'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          repository: floooh/sokol-d
          ssh-key: ${{ secrets.GHACTIONS_D_PUSH }}
      - uses: actions/download-artifact@v4
        with:
          name: ignore-me-d
          path: src/sokol
      - name: "commit and push"
        run: |
          git config user.email "none"
          git config user.name "GH Action"
          git add -A
          git diff-index --quiet HEAD || git commit -m "updated (https://github.com/floooh/sokol/commit/${{ github.sha }})"
          git push

  deploy-jai:
    needs: test-jai
    if: github.ref == 'refs/heads/master'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          repository: colinbellino/sokol-jai
          ssh-key: ${{ secrets.GHACTIONS_JAI_PUSH }}
      - uses: actions/download-artifact@v4
        with:
          name: ignore-me-jai
          path: sokol
      - name: "commit and push"
        run: |
          git config user.email "none"
          git config user.name "GH Action"
          git add -A
          git diff-index --quiet HEAD || git commit -m "updated (https://github.com/floooh/sokol/commit/${{ github.sha }})"
          git push

  deploy-c3:
    needs: test-c3
    if: github.ref == 'refs/heads/master'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@main
        with:
          repository: floooh/sokol-c3
          ssh-key: ${{ secrets.GHACTIONS_C3_PUSH }}
      - uses: actions/download-artifact@main
        with:
          name: ignore-me-c3
          path: sokol.c3l
      - name: "commit and push"
        run: |
          git config user.email "none"
          git config user.name "GH Action"
          git add -A
          git diff-index --quiet HEAD || git commit -m "updated (https://github.com/floooh/sokol/commit/${{ github.sha }})"
          git push
