# This workflow will build a .NET project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net

name: dotnet-ci

on:
  workflow_dispatch:
  pull_request:
    branches: [ "0.2" ]
  push:
    branches: [ "0.2" ]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}-${{ github.head_ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/0.2' || github.ref != 'refs/heads/dotnet' }}

permissions:
  contents: read
  packages: write

jobs:
  paths-filter:
    runs-on: ubuntu-latest
    outputs:
      hasChanges: ${{ steps.filter.outputs.dotnet == 'true'}}
    steps:
      - uses: actions/checkout@v4
      - uses: dorny/paths-filter@v2
        id: filter
        with:
          filters: |
            dotnet:
              - "dotnet/**"
            workflows:
              - ".github/workflows/**"
      - name: dotnet has changes
        run: echo "dotnet has changes"
        if: steps.filter.outputs.dotnet == 'true'
      - name: workflows has changes
        run: echo "workflows has changes"
        if: steps.filter.outputs.workflows == 'true'
  build:
    name: Dotnet Build
    needs: paths-filter
    if: needs.paths-filter.outputs.hasChanges == 'true'
    defaults:
      run:
        working-directory: dotnet
    strategy:
      fail-fast: false
      matrix:
        os: [ ubuntu-latest, macos-latest ]
        python-version: ["3.11"]
    runs-on: ${{ matrix.os }}
    timeout-minutes: 30
    steps:
    - uses: actions/checkout@v4
      with:
        lfs: true
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install jupyter and ipykernel
      run: |
        python -m pip install --upgrade pip
        python -m pip install jupyter
        python -m pip install ipykernel
    - name: list available kernels
      run: |
        python -m jupyter kernelspec list
    - name: Setup .NET
      uses: actions/setup-dotnet@v4
      with:
        dotnet-version: '8.0.x'
    - name: Restore dependencies
      run: |
        # dotnet nuget add source --name dotnet-tool https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json --configfile NuGet.config
        dotnet restore -bl
    - name: Format check
      run: |
        echo "Format check"
        echo "If you see any error in this step, please run 'dotnet format' locally to format the code."
        dotnet format --verify-no-changes -v diag --no-restore
    - name: Build
      run: |
        echo "Build AutoGen"
        dotnet build --no-restore --configuration Release -bl /p:SignAssembly=true
    - name: Unit Test
      run: dotnet test --no-build -bl --configuration Release
  aot-test: # this make sure the AutoGen.Core is aot compatible
    strategy:
      fail-fast: false  # ensures the entire test matrix is run, even if one permutation fails
      matrix:
        os: [ ubuntu-latest ]
        version: [ net8.0 ]
    needs: build
    defaults:
      run:
        working-directory: dotnet

    runs-on: ${{ matrix.os }}
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0 # fetching all

    - name: Setup dotnet
      uses: actions/setup-dotnet@v4
      with:
        dotnet-version: '8.0.x'

    - name: publish AOT testApp, assert static analysis warning count, and run the app
      shell: pwsh
      run: ./.tools/test-aot-compatibility.ps1 ${{ matrix.version }}
  openai-test:
    name: Run openai test
    runs-on: ubuntu-latest
    environment: dotnet
    defaults:
      run:
        working-directory: dotnet
    if: success() && (github.ref == 'refs/heads/0.2')
    needs: aot-test
    steps:
    - uses: actions/checkout@v4
      with:
        lfs: true
    - name: Set up Python 3.11
      uses: actions/setup-python@v5
      with:
        python-version: 3.11
    - name: Install jupyter and ipykernel
      run: |
        python -m pip install --upgrade pip
        python -m pip install jupyter
        python -m pip install ipykernel
    - name: list available kernels
      run: |
        python -m jupyter kernelspec list
    - name: Setup .NET
      uses: actions/setup-dotnet@v4
      with:
        global-json-file: dotnet/global.json
    - name: Restore dependencies
      run: |
        dotnet restore -bl
    - name: Build
      run: |
        echo "Build AutoGen"
        dotnet build --no-restore --configuration Release -bl /p:SignAssembly=true
    - name: OpenAI Test
      run: dotnet test --no-build -bl --configuration Release
      env:
        AZURE_OPENAI_API_KEY: ${{ secrets.AZURE_OPENAI_API_KEY }}
        AZURE_OPENAI_ENDPOINT: ${{ secrets.AZURE_OPENAI_ENDPOINT }}
        AZURE_GPT_35_MODEL_ID: ${{ secrets.AZURE_GPT_35_MODEL_ID }}
        OEPNAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
    - name: Pack
      run: |
        echo "Create nightly build package"
        dotnet pack --no-build --configuration Release --output './output/nightly' -p:VersionSuffix=nightly-${{github.run_id}} -bl

        echo "Create release build package"
        dotnet pack --no-build --configuration Release --output './output/release' -bl

        echo "ls output directory"
        ls -R ./output
    - name: Upload package
      uses: actions/upload-artifact@v4
      with:
        name: nightly
        path: ./dotnet/output/nightly
    - name: Upload package
      uses: actions/upload-artifact@v4
      with:
        name: release
        path: ./dotnet/output/release
  publish:
    environment: dotnet-internal-feed
    name: Publish to nightly feeds
    runs-on: ubuntu-latest
    defaults:
      run:
        working-directory: dotnet
    needs: openai-test
    steps:
    - name: Setup .NET
      uses: actions/setup-dotnet@v4
      with:
        dotnet-version: '6.0.x'
        source-url: https://devdiv.pkgs.visualstudio.com/DevDiv/_packaging/AutoGen/nuget/v3/index.json
      env:
        NUGET_AUTH_TOKEN: ${{ secrets.AZURE_DEVOPS_TOKEN }}
    - uses: actions/download-artifact@v4
      with:
        name: nightly
        path: ./dotnet/output/nightly
    - uses: actions/download-artifact@v4
      with:
        name: release
        path: ./dotnet/output/release
    - name: Publish nightly package to Azure Devops
      run: |
        echo "Publish nightly package to Azure Devops"
        echo "ls output directory"
        ls -R ./output/nightly
        dotnet nuget push --api-key AzureArtifacts ./output/nightly/*.nupkg --skip-duplicate
      env:
        AZURE_ARTIFACTS_FEED_URL: https://devdiv.pkgs.visualstudio.com/DevDiv/_packaging/AutoGen/nuget/v3/index.json
        NUGET_AUTH_TOKEN: ${{ secrets.AZURE_DEVOPS_TOKEN }}
      continue-on-error: true
    - name: Publish nightly package to github package
      run: |
        echo "Publish nightly package to github package"
        echo "ls output directory"
        ls -R ./output/nightly
        dotnet nuget push --api-key ${{ secrets.GITHUB_TOKEN }} --source "https://nuget.pkg.github.com/microsoft/index.json" ./output/nightly/*.nupkg --skip-duplicate
      continue-on-error: true
    - name: Publish nightly package to agentchat myget feed
      run: |
        echo "Publish nightly package to agentchat myget feed"
        echo "ls output directory"
        ls -R ./output/nightly
        dotnet nuget push --api-key ${{ secrets.MYGET_TOKEN }} --source "https://www.myget.org/F/agentchat/api/v3/index.json" ./output/nightly/*.nupkg --skip-duplicate
      env:
        MYGET_TOKEN: ${{ secrets.MYGET_TOKEN }}
      continue-on-error: true

