name: release-nuget-package

on:
  workflow_dispatch:

concurrency:
  group: release-nuget-package
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  build-libs:
    name: ${{ matrix.os }} ${{ matrix.arch }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [windows-2019]
        arch: [x64, x86, arm64]

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Build sherpa-onnx
        shell: bash
        run: |
          arch=${{ matrix.arch }}
          opts=""
          if [ $arch == x86 ]; then
            opts="-A Win32"
          elif [ $arch == arm64 ]; then
            opts="-A ARM64"
          fi

          mkdir build
          cd build
          cmake \
            $opts \
            -DBUILD_SHARED_LIBS=ON \
            -DCMAKE_INSTALL_PREFIX=./install \
            -DCMAKE_BUILD_TYPE=Release \
            -DSHERPA_ONNX_ENABLE_WEBSOCKET=OFF \
            -DBUILD_ESPEAK_NG_EXE=OFF \
            -DSHERPA_ONNX_BUILD_C_API_EXAMPLES=OFF  \
            -DSHERPA_ONNX_ENABLE_BINARY=ON \
            ..

          cmake --build . --target install --config Release
          rm -rf install/pkgconfig

      - name: Create tar file
        shell: bash
        run: |
          arch=${{ matrix.arch }}

          cd build

          SHERPA_ONNX_VERSION=$(grep "SHERPA_ONNX_VERSION" ../CMakeLists.txt  | cut -d " " -f 2  | cut -d '"' -f 2)

          dst=sherpa-onnx-$SHERPA_ONNX_VERSION-win-$arch
          mv install/lib $dst
          tar cjvf $dst.tar.bz2 $dst
          ls -lh *.tar.bz2
          mv *.tar.bz2 ../

      - uses: actions/upload-artifact@v4
        with:
          name: windows-${{ matrix.arch }}
          path: ./*.tar.bz2

      # https://huggingface.co/docs/hub/spaces-github-actions
      - name: Publish to huggingface
        if: (github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa') && (github.event_name == 'push' || github.event_name == 'workflow_dispatch')
        env:
          HF_TOKEN: ${{ secrets.HF_TOKEN }}
        uses: nick-fields/retry@v3
        with:
          max_attempts: 20
          timeout_seconds: 200
          shell: bash
          command: |
            git config --global user.email "csukuangfj@gmail.com"
            git config --global user.name "Fangjun Kuang"

            rm -rf huggingface
            export GIT_CLONE_PROTECTION_ACTIVE=false
            export GIT_LFS_SKIP_SMUDGE=1

            git clone https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs huggingface

            cd huggingface
            git fetch
            git pull
            mkdir -p windows-for-dotnet

            cp -v ../sherpa-onnx-*.tar.bz2 ./windows-for-dotnet

            git status
            git lfs track "*.bz2"

            git add .

            git commit -m "add more files"

            git push https://csukuangfj:$HF_TOKEN@huggingface.co/csukuangfj/sherpa-onnx-libs main
            rm -rf huggingface

  release-nuget-package:
    runs-on: ${{ matrix.os }}
    needs: [build-libs]
    strategy:
      fail-fast: false
      matrix:
        os: [ubuntu-latest]

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: |
            6.0.x
            7.0.x

      - name: Install Python dependencies
        shell: bash
        run: |
          python3 -m pip install --upgrade pip Jinja2

      - name: Retrieve artifact from windows x64
        uses: actions/download-artifact@v4
        with:
          name: windows-x64
          path: /tmp/windows-x64

      - name: Retrieve artifact from windows x86
        uses: actions/download-artifact@v4
        with:
          name: windows-x86
          path: /tmp/windows-x86

      - name: Retrieve artifact from windows arm64
        uses: actions/download-artifact@v4
        with:
          name: windows-arm64
          path: /tmp/windows-arm64

      - name: Check dotnet
        run: dotnet --info

      - name: Build
        shell: bash
        run: |
          sudo apt-get install -y tree
          ls -lh /tmp/

          tree /tmp/windows*
          echo "----"

          rm -fv /tmp/windows*/*.lib
          tree /tmp/windows*

      - name: Build
        shell: bash
        run: |
          cd scripts/dotnet
          ./run.sh

          ls -lh /tmp/packages

      - name: publish .Net packages to nuget.org
        if: github.repository_owner == 'csukuangfj' || github.repository_owner == 'k2-fsa'
        shell: bash
        env:
          API_KEY: ${{ secrets.NUGET_API_KEY }}
        run: |
          # API_KEY is valid until 2025.04.26
          cd /tmp/packages
          dotnet nuget push ./org.k2fsa.sherpa.onnx.*.nupkg --skip-duplicate --api-key $API_KEY --source https://api.nuget.org/v3/index.json
