---
name: Test Windows

on:
  pull_request:
  workflow_dispatch:
  merge_group:

env:
  TWITCH_PUBSUB_SERVER_TAG: v1.0.12
  HTTPBOX_TAG: v0.2.1
  QT_QPA_PLATFORM: minimal
  CONAN_VERSION: 2.28.1

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

jobs:
  test-windows:
    name: "Test ${{ matrix.os }}, Qt ${{ matrix.qt-version }}"
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [windows-latest]
        qt-version: [6.8.3]
        skip-artifact: [false]
        skip-crashpad: [false]
      fail-fast: false
    env:
      QT_MODULES: qtimageformats
      C2_USE_OPENSSL3: ${{ case(startsWith(matrix.qt-version, '6.'), 'True', 'False') }}
      C2_CONAN_CACHE_SUFFIX: ${{ case(startsWith(matrix.qt-version, '6.'), '-QT6', '') }}

    steps:
      - name: Set Crashpad
        if: matrix.skip-crashpad == false
        run: |
          echo "C2_ENABLE_CRASHPAD=ON" >> "$Env:GITHUB_ENV"

      - uses: actions/checkout@v7
        with:
          submodules: recursive
          fetch-depth: 0 # allows for tags access

      - name: Install Qt
        uses: jurplel/install-qt-action@v4.3.1
        with:
          cache: true
          cache-key-prefix: ${{ runner.os }}-QtCache-${{ matrix.qt-version }}-v2
          modules: ${{ env.QT_MODULES }}
          version: ${{ matrix.qt-version }}

      - name: Enable Developer Command Prompt
        uses: Chatterino/msvc-dev-cmd@v2.0.7

      - name: Setup sccache
        # sccache v0.7.4
        uses: hendrikmuhs/ccache-action@v1.2.23
        with:
          variant: sccache
          # only save on the default (master) branch
          save: ${{ github.event_name == 'push' }}
          key: sccache-test-${{ matrix.os }}-${{ matrix.qt-version }}-${{ matrix.skip-crashpad }}
          restore-keys: |
            sccache-test-${{ matrix.os }}-${{ matrix.qt-version }}

      - name: Cache conan packages
        uses: actions/cache@v6
        with:
          key: ${{ runner.os }}-conan-user-${{ hashFiles('**/conanfile.py') }}${{ env.C2_CONAN_CACHE_SUFFIX }}
          path: ~/.conan2/

      - name: Install Conan
        run: |
          python3 -c "import site; import sys; print(f'{site.USER_BASE}\\Python{sys.version_info.major}{sys.version_info.minor}\\Scripts')" >> "$Env:GITHUB_PATH"
          pip3 install --user "conan==${{ env.CONAN_VERSION }}"

      - name: Setup Conan
        run: |
          conan --version
          conan profile detect -f

      - name: Install dependencies
        run: |
          mkdir build-test
          cd build-test
          conan install .. `
              -s build_type=RelWithDebInfo `
              -c tools.cmake.cmaketoolchain:generator="NMake Makefiles" `
              -b missing `
              --output-folder=. `
              -o with_openssl3="$Env:C2_USE_OPENSSL3"

      # The Windows runners currently use an older version of the CRT
      - name: Install CRT
        run: |
          mkdir -Force build-test/bin
          cp "$((ls $Env:VCToolsRedistDir/onecore/x64 -Filter '*.CRT')[0].FullName)/*" build-test/bin

      - name: Install httpbox
        run: |
          mkdir httpbox
          Invoke-WebRequest -Uri "https://github.com/Chatterino/httpbox/releases/download/${{ env.HTTPBOX_TAG }}/httpbox-x86_64-pc-windows-msvc.zip" -outfile "httpbox.zip"
          Expand-Archive httpbox.zip -DestinationPath httpbox
          rm httpbox.zip

      - name: Build
        run: |
          cmake `
              -G"NMake Makefiles" `
              -DCMAKE_BUILD_TYPE=RelWithDebInfo `
              -DBUILD_TESTS=On `
              -DBUILD_APP=OFF `
              -DCMAKE_TOOLCHAIN_FILE="conan_toolchain.cmake" `
              -DUSE_PRECOMPILED_HEADERS=On `
              -DBUILD_WITH_CRASHPAD="$Env:C2_ENABLE_CRASHPAD" `
              -DCHATTERINO_SPELLCHECK=On `
              ..
          set cl=/MP
          nmake /S /NOLOGO
        working-directory: build-test

      - name: Download and extract Twitch PubSub Server Test
        run: |
          mkdir pubsub-server-test
          Invoke-WebRequest -Uri "https://github.com/Chatterino/twitch-pubsub-server-test/releases/download/${{ env.TWITCH_PUBSUB_SERVER_TAG }}/server-${{ env.TWITCH_PUBSUB_SERVER_TAG }}-windows-amd64.zip" -outfile "pubsub-server.zip"
          Expand-Archive pubsub-server.zip -DestinationPath pubsub-server-test
          rm pubsub-server.zip
          cd pubsub-server-test
          cd ..

      - name: Test
        timeout-minutes: 30
        run: |
          ..\httpbox\httpbox.exe --port 9051 &
          cd ..\pubsub-server-test
          ./server 127.0.0.1:9050 127.0.0.1:9052 &
          cd ..\build-test
          ctest --repeat until-pass:4 --output-on-failure
        working-directory: build-test

      - name: Clean Conan cache
        run: conan cache clean --source --build --download "*"
