name: bindings/csharp

on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

jobs:  
  build-ffi:
    name: 'Build Regorus FFI: (${{ matrix.runtime.target }})'
    runs-on: ${{ matrix.runtime.os }}
    strategy:
      # let us get failures from other jobs even if one fails
      fail-fast: false
      matrix:
        runtime:
          - os: windows-latest
            target: x86_64-pc-windows-msvc
            libpath: |
              **/release/regorus_ffi.dll
              **/release/regorus_ffi.pdb
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            libpath: |
              **/release/libregorus_ffi.so
          # Disabled for now
          #- os: macos-latest
          #  target: aarch64-apple-darwin
          #  libpath: |
          #    **/release/libregorus_ffi.dylib
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Build Regorus binding
        run: cargo build -r --target ${{ matrix.runtime.target }} --locked
        working-directory: ./bindings/ffi
        
      - name: Upload regorus ffi shared library
        uses: actions/upload-artifact@v4
        with:
          name: regorus-ffi-artifacts-${{ matrix.runtime.target }}
          # Note: The full path of each artifact relative to . is preserved.
          path: ${{ matrix.runtime.libpath }}
          if-no-files-found: error
          retention-days: 1

  build-nuget:
    name: 'Build Regorus nuget'
    runs-on: ubuntu-latest
    needs: build-ffi
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0  
      - uses: actions/setup-dotnet@v4
        with:
          global-json-file: ./bindings/csharp/global.json

      - run: echo '${{ steps.stepid.outputs.dotnet-version }}'

      - name: Download regorus ffi shared libraries
        uses: actions/download-artifact@v4
        with:
          pattern: regorus-ffi-artifacts-*
          merge-multiple: true
          path: ./bindings/csharp/Regorus/tmp

      - name: Display regorus ffi artifacts
        run: ls -R ./bindings/csharp/Regorus/tmp

      # Note that we need to supply the target folder within the folder where artifacts are downloaded.
      - name: Build Regorus binding
        run: dotnet build /p:Configuration=Release /p:RegorusFFIArtifactsDir=./tmp/bindings/ffi/target
        working-directory: ./bindings/csharp/Regorus

      - name: Pack
        run: dotnet pack /p:RegorusFFIArtifactsDir=./tmp/bindings/ffi/target
        working-directory: ./bindings/csharp/Regorus

      - name: Upload Regorus nuget
        uses: actions/upload-artifact@v4
        with:
          name: regorus-nuget
          path: bindings/csharp/Regorus/bin/Release/Regorus*.nupkg
          if-no-files-found: error
          retention-days: 1

  test-nuget:
    name: 'Test Regorus Nuget: (${{ matrix.runtime.target }})'
    needs: build-nuget
    runs-on: ${{ matrix.runtime.os }}
    strategy:
      # let us get failures from other jobs even if one fails
      fail-fast: false
      matrix:
        runtime:
          - os: windows-latest
            target: x86_64-pc-windows-msvc
          - os: ubuntu-latest
            target: x86_64-unknown-linux-gnu
          #- os: macos-latest
          #  target: aarch64-apple-darwin
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - uses: actions/setup-dotnet@v4
        with:
          global-json-file: ./bindings/csharp/global.json

      - run: echo '${{ steps.stepid.outputs.dotnet-version }}'

      - name: Download regorus nuget
        uses: actions/download-artifact@v4
        with:
          name: regorus-nuget
          path: ./bindings/csharp/Regorus.Tests/regorus-nuget/

      - name: Restore Regorus.Tests
        run: dotnet restore /p:RestoreAdditionalProjectSources=./regorus-nuget
        working-directory: ./bindings/csharp/Regorus.Tests

      - name: Run Regorus.Tests
        run: dotnet test --no-restore
        working-directory: ./bindings/csharp/Regorus.Tests