# Copyright (c) Microsoft Corporation. All rights reserved.
#
name: bindings/csharp

on:
  workflow_dispatch:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]
  schedule:
    # Run at 8:00 AM every day
    - cron: "0 8 * * *"

env:
  VersionSuffix: ${{ github.event_name == 'workflow_dispatch' && 'manualtrigger' || null }}

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
          - os: macos-latest
            target: aarch64-apple-darwin
            libpath: |
              **/release/libregorus_ffi.dylib
    steps:
      - name: Checkout repository
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0
      - uses: ./.github/actions/toolchains/rust
        with:
          targets: ${{ matrix.runtime.target }}
      - name: Cache cargo
        uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
        with:
          shared-key: ${{ runner.os }}-regorus
      - name: Fetch dependencies
        run: cargo fetch --locked

      - name: Fetch FFI crate dependencies
        run: cargo fetch --locked --manifest-path bindings/ffi/Cargo.toml --target ${{ matrix.runtime.target }}

      - name: Build Regorus FFI via xtask
        run: cargo xtask build-ffi --release --target ${{ matrix.runtime.target }}
        
      - name: Upload regorus ffi shared library
        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        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-csharp:
    name: 'Build Regorus nuget'
    runs-on: ubuntu-latest
    needs: build-ffi
    steps:
      - name: Checkout repository
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0  
      - uses: ./.github/actions/toolchains/rust
      - uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5.2.0
        with:
          global-json-file: ./bindings/csharp/global.json

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

      - name: Cache cargo
        uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
        with:
          shared-key: ${{ runner.os }}-regorus

      - name: Fetch dependencies
        run: cargo fetch --locked

      - name: Download regorus ffi shared libraries
        uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
        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

      - name: Build Regorus nuget via xtask
        run: cargo xtask build-csharp --release --clean --artifacts-dir ./bindings/csharp/Regorus/tmp/bindings/ffi/target --enforce-artifacts --repository-commit ${{ github.sha }} --include-symbols

      - name: Upload Regorus nuget
        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        with:
          name: regorus-nuget
          path: |
            bindings/csharp/Regorus/bin/Release/Microsoft.Regorus*.nupkg
            bindings/csharp/Regorus/bin/Release/Microsoft.Regorus*.snupkg
          if-no-files-found: error
          retention-days: 1

  test-nuget:
    name: 'Test Regorus Nuget: (${{ matrix.runtime.target }})'
    needs: build-csharp
    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@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
        with:
          fetch-depth: 0

      - uses: ./.github/actions/toolchains/rust

      - uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5.2.0
        with:
          global-json-file: ./bindings/csharp/global.json

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

      - name: Cache cargo
        uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
        with:
          shared-key: ${{ runner.os }}-regorus

      - name: Fetch dependencies
        run: cargo fetch --locked

      - name: Download regorus nuget
        uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
        with:
          name: regorus-nuget
          path: ./bindings/csharp/Regorus/bin/Release

      - name: Display regorus nuget
        run: ls -R ./bindings/csharp/Regorus/bin/Release

      - name: Run C# tests via xtask
        run: cargo xtask test-csharp --release --clean --nuget-dir bindings/csharp/Regorus/bin/Release

      
