# This workflow builds and tests the Python implementation of TsFile on
# Windows using the MSVC toolchain, as a complement to unit-test-python.yml
# which builds the Windows target with MinGW.
#
# The C++ shared library (libtsfile) is built with the v141 toolset (the
# Visual Studio 2017 compiler) to match the VS 2017 support this branch
# targets. The Cython extension links to it through the plain C wrapper ABI,
# so it builds cleanly with whichever MSVC toolset setuptools selects.

name: Unit-Test-Py-MSVC

on:
  push:
    branches:
      - develop
      - iotdb
      - rc/*
    paths-ignore:
      - 'docs/**'
      - 'java/**'
  pull_request:
    branches:
      - develop
      - dev/*
      - iotdb
      - rc/*
    paths-ignore:
      - 'docs/**'
      - 'java/**'
  # Enable manually starting builds.
  workflow_dispatch:

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

env:
  MAVEN_OPTS: -Dhttp.keepAlive=false -Dmaven.wagon.http.pool=false -Dmaven.wagon.http.retryHandler.class=standard -Dmaven.wagon.http.retryHandler.count=3
  DEVELOCITY_ACCESS_KEY: ${{ secrets.DEVELOCITY_ACCESS_KEY }}

jobs:
  unit-test-py-msvc:
    strategy:
      fail-fast: false
      matrix:
        python-version: ["3.9", "3.11", "3.14"]
    # Pinned to windows-2022 deliberately: it ships Visual Studio 2022, which
    # the "Visual Studio 17 2022" CMake generator requires. The v141 (VS 2017)
    # toolset is installed by a step below. See unit-test-cpp-msvc.yml for the
    # full rationale.
    runs-on: windows-2022

    steps:

      - name: Checkout repository
        uses: actions/checkout@v7

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v7
        with:
          python-version: ${{ matrix.python-version }}

      - name: Set up JDK 17
        uses: actions/setup-java@v5.6.0
        with:
          distribution: corretto
          java-version: 17

      # Setup caching of the artifacts in the .m2 directory, so they don't have
      # to all be downloaded again for every build.
      - name: Cache Maven packages
        uses: actions/cache@v6
        with:
          path: ~/.m2
          key: ${{ runner.os }}-m2-msvc-${{ hashFiles('**/pom.xml') }}
          restore-keys: ${{ runner.os }}-m2-

      # Make the MSVC toolchain available so setup.py can compile the Cython
      # extension with cl.exe.
      - name: Set up MSVC developer environment
        uses: ilammy/msvc-dev-cmd@v1
        with:
          arch: x64

      # The windows-2022 image no longer ships the v141 (VS 2017) toolset that
      # this build pins via -Dmsvc.toolset=v141, so install the component on
      # demand. With it present the VS 2022 generator can build libtsfile with
      # the VS 2017 compiler.
      - name: Install MSVC v141 (VS 2017) toolset
        shell: pwsh
        run: |
          $ErrorActionPreference = "Stop"
          $installerDir = "C:\Program Files (x86)\Microsoft Visual Studio\Installer"
          $installPath = & (Join-Path $installerDir "vswhere.exe") -latest -property installationPath
          Write-Host "Visual Studio install path: $installPath"

          # The v141 (VS 2017) toolset always installs as a 14.16.* directory.
          function Test-V141Toolset {
            [bool](Get-ChildItem -Path (Join-Path $installPath "VC\Tools\MSVC") `
              -Directory -Filter "14.16.*" -ErrorAction SilentlyContinue)
          }

          if (Test-V141Toolset) {
            Write-Host "v141 toolset already present."
          } else {
            # vs_installer.exe 'modify' accepts only a limited switch set;
            # bootstrapper-only switches such as --wait / --nocache make it
            # fail with exit code 87 (ERROR_INVALID_PARAMETER).
            $argString = "modify --installPath `"$installPath`" " +
              "--add Microsoft.VisualStudio.Component.VC.v141.x86.x64 " +
              "--quiet --norestart"
            $proc = Start-Process -FilePath (Join-Path $installerDir "vs_installer.exe") `
              -ArgumentList $argString -Wait -PassThru
            Write-Host "vs_installer exit code: $($proc.ExitCode)"
            # vs_installer may delegate to a background process; wait for it.
            Get-Process -Name "vs_installer", "setup" -ErrorAction SilentlyContinue |
              Wait-Process -Timeout 900 -ErrorAction SilentlyContinue
            if (-not (Test-V141Toolset)) {
              throw "v141 toolset not found after install (vs_installer exit code $($proc.ExitCode))"
            }
            Write-Host "v141 toolset installed."
          }

      # Build C++ (MSVC, v141 toolset) and the Python extension, then run the
      # Python test-suite. -P with-python builds the cpp module first.
      # spotless (black/clang-format) is already covered by the non-MSVC
      # workflows, so it is skipped here to keep this workflow focused.
      - name: Build and test with Maven (MSVC)
        shell: bash
        run: |
          ./mvnw.cmd -P with-python \
            -Dcpp.toolchain=msvc \
            -Dmsvc.toolset=v141 \
            -Denable.asan=OFF \
            -Dbuild.type=Release \
            -Dspotless.skip=true \
            clean verify

      - name: Upload whl Artifact
        uses: actions/upload-artifact@v7
        with:
          name: tsfile-msvc-${{ runner.os }}-py${{ matrix.python-version }}-whl
          path: python/dist/tsfile-*.whl
          retention-days: 1
