name: build-nuget-package

on: [push, pull_request]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  # Build macos intel
  build_macos_intel:
    runs-on: macos-15-intel
    steps:
      - uses: actions/checkout@v4
      - name: Build HiGHS
        run: |
         cmake -E make_directory ${{runner.workspace}}/build

      - name: Configure CMake
        working-directory: ${{runner.workspace}}/build
        run: cmake $GITHUB_WORKSPACE -DCSHARP=ON -DBUILD_DOTNET=ON

      - name: Build
        working-directory: ${{runner.workspace}}/build
        run: cmake --build . --config Release --parallel

      - uses: actions/upload-artifact@v4
        with:
          name: macos-x64
          path: ${{runner.workspace}}/build/dotnet/Highs.Native/runtimes

  # Build macos arm64
  build_macos_arm:
    runs-on: macos-14  # macos-14 is arm64
    steps:
      - uses: actions/checkout@v4
      - name: Build HiGHS
        run: |
         cmake -E make_directory ${{runner.workspace}}/build

      - name: Configure CMake
        working-directory: ${{runner.workspace}}/build
        run: cmake $GITHUB_WORKSPACE -DCSHARP=ON -DBUILD_DOTNET=ON

      - name: Build
        working-directory: ${{runner.workspace}}/build
        run: cmake --build . --config Release --parallel

      - uses: actions/upload-artifact@v4
        with:
          name: macos-arm64
          path: ${{runner.workspace}}/build/dotnet/Highs.Native/runtimes

  # Build windows 32 and linux
  build_windows_32:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4
      - name: Build HiGHS
        run: |
         cmake -E make_directory ${{runner.workspace}}/build32

      - name: Configure CMake win32
        shell: bash
        working-directory: ${{runner.workspace}}/build32
        run: cmake $GITHUB_WORKSPACE -DCSHARP=ON -DBUILD_DOTNET=ON -A Win32

      - name: Build win32
        shell: bash
        working-directory: ${{runner.workspace}}/build32
        run: cmake --build . --config Release --parallel

      - uses: actions/upload-artifact@v4
        with:
          name: win-x32
          path: ${{runner.workspace}}/build32/dotnet/Highs.Native/runtimes/win-x64/

  build_linux:
    runs-on: ubuntu-latest
    container: stabletec/build-core:debian-11
    steps:
      - uses: actions/checkout@v4
      - name: Build HiGHS
        run: |
         cmake -E make_directory /__w/HiGHS/HiGHS/build

      - name: Configure CMake
        working-directory: /__w/HiGHS/HiGHS/build
        run: cmake $GITHUB_WORKSPACE -DCSHARP=ON -DBUILD_DOTNET=ON

      - name: Build
        working-directory: /__w/HiGHS/HiGHS/build
        run: cmake --build . --config Release --parallel

      - uses: actions/upload-artifact@v4
        with:
          name: linux-x64
          path: /__w/HiGHS/HiGHS/build/dotnet/Highs.Native/runtimes

  build_linux_arm64:
    runs-on: ubuntu-24.04-arm
    container: stabletec/build-core:debian-11
    steps:
      - uses: actions/checkout@v4
      - name: Build HiGHS
        run: |
         cmake -E make_directory /__w/HiGHS/HiGHS/build_linux_arm64

      - name: Configure CMake linux-arm-64
        working-directory: /__w/HiGHS/HiGHS/build_linux_arm64
        shell: bash
        run: cmake $GITHUB_WORKSPACE -DCSHARP=ON -DBUILD_DOTNET=ON -DCMAKE_TOOLCHAIN_FILE=$GITHUB_WORKSPACE/nuget/arm-toolchain.cmake

      - name: Build linux-arm-64
        working-directory: /__w/HiGHS/HiGHS/build_linux_arm64
        shell: bash
        run: cmake --build . --config Release --parallel

      - uses: actions/upload-artifact@v4
        with:
          name: linux-arm64
          path: /__w/HiGHS/HiGHS/build_linux_arm64/dotnet/Highs.Native/runtimes

  build_windows:
    runs-on: windows-latest
    needs: [build_macos_intel, build_macos_arm, build_windows_32, build_linux, build_linux_arm64]
    steps:
      - uses: actions/checkout@v4
      - name: Build HiGHS Windows native
        run: |
         cmake -E make_directory ${{runner.workspace}}/build

      - name: Configure CMake
        working-directory: ${{runner.workspace}}/build
        shell: bash
        run: cmake $GITHUB_WORKSPACE -DCSHARP=ON -DBUILD_DOTNET=ON

      - name: Build
        working-directory: ${{runner.workspace}}/build
        shell: bash
        run: cmake --build . --config Release --parallel

      - name: Display structure of downloaded files
        run: |
          pwd
          ls -R ${{runner.workspace}}/build/dotnet/Highs.Native/runtimes

      - name: Download runtimes macos-x64
        uses: actions/download-artifact@v4
        with:
          name: macos-x64
          path: ${{runner.workspace}}/build/dotnet/Highs.Native/runtimes

      - name: Download runtimes macos-arm64
        uses: actions/download-artifact@v4
        with:
          name: macos-arm64
          path: ${{runner.workspace}}/build/dotnet/Highs.Native/runtimes

      - name: Download runtimes win-x32
        uses: actions/download-artifact@v4
        with:
          name: win-x32
          path: ${{runner.workspace}}/build/dotnet/Highs.Native/runtimes/win-x32

      - name: Download runtimes
        uses: actions/download-artifact@v4
        with:
          name: linux-x64
          path: ${{runner.workspace}}/build/dotnet/Highs.Native/runtimes

      - name: Download runtimes
        uses: actions/download-artifact@v4
        with:
          name: linux-arm64
          path: ${{runner.workspace}}/build/dotnet/Highs.Native/runtimes

      - name: Display structure of downloaded files
        run: ls -R ${{runner.workspace}}/build/dotnet/Highs.Native/runtimes

      - uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '6.0.x'

      - name: Dotnet pack
        working-directory: ${{runner.workspace}}/build/dotnet/Highs.Native
        run: dotnet pack -c Release /p:Version=1.12.0

      - uses: actions/upload-artifact@v4
        with:
          name: nuget
          path: ${{runner.workspace}}/build/dotnet/Highs.Native/bin/Release/*.nupkg

  dotnet_push:
    runs-on: windows-latest
    needs: [build_windows]
    environment:
      name: nuget

    if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-dotnet@v4

      - name: Download nuget
        uses: actions/download-artifact@v4
        with:
          name: nuget

      - name: Dotnet push
        run: dotnet nuget push "*.nupkg" --api-key ${{secrets.nuget_api_key}} --source https://api.nuget.org/v3/index.json
      #     env:
      #       GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
