# Syntax reference https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions
# Environment reference https://help.github.com/en/actions/reference/virtual-environments-for-github-hosted-runners
name: release-windows

on:
  push:
    tags:
      - '2.*'
  schedule:
    - cron:  '0 0 * * *'
  workflow_dispatch:

permissions:
  contents: read

defaults:
  run:
    shell: cmd

jobs:

  build:

    runs-on: windows-2025
    if: ${{ github.repository_owner == 'danmar' }}

    env:
      # see https://www.pcre.org/original/changelog.txt
      PCRE_VERSION: 8.45
      QT_VERSION: 6.10.0
      BOOST_MINOR_VERSION: 89

    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false

      - name: Set up Visual Studio environment
        uses: ilammy/msvc-dev-cmd@v1

      - name: Download PCRE
        run: |
          curl -fsSL https://github.com/pfultz2/pcre/archive/refs/tags/%PCRE_VERSION%.zip -o pcre-%PCRE_VERSION%.zip || exit /b !errorlevel!

      - name: Install PCRE
        run: |
          @echo on
          7z x pcre-%PCRE_VERSION%.zip || exit /b !errorlevel!
          cd pcre-%PCRE_VERSION% || exit /b !errorlevel!
          git apply --ignore-space-change ..\externals\pcre.patch || exit /b !errorlevel!
          cmake . -G "Visual Studio 17 2022" -A x64 -DPCRE_BUILD_PCRECPP=OFF -DPCRE_BUILD_PCREGREP=OFF -DPCRE_BUILD_TESTS=OFF -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_COMPILE_WARNING_AS_ERROR=On || exit /b !errorlevel!
          msbuild -m PCRE.sln -p:Configuration=Release -p:Platform=x64 || exit /b !errorlevel!
          copy pcre.h ..\externals || exit /b !errorlevel!
          copy Release\pcre.lib ..\externals\pcre64.lib || exit /b !errorlevel!

      - name: Download Boost
        run: |
          curl -fsSL https://archives.boost.io/release/1.%BOOST_MINOR_VERSION%.0/source/boost_1_%BOOST_MINOR_VERSION%_0.7z -o boost.zip || exit /b !errorlevel!

      - name: Install Boost
        run: |
          @echo on
          7z x boost.zip boost_1_%BOOST_MINOR_VERSION%_0/boost || exit /b !errorlevel!
          ren boost_1_%BOOST_MINOR_VERSION%_0 boost || exit /b !errorlevel!

      # available modules: https://github.com/miurahr/aqtinstall/blob/master/docs/getting_started.rst#installing-modules
      # available tools:   https://github.com/miurahr/aqtinstall/blob/master/docs/getting_started.rst#installing-tools
      - name: Install Qt ${{ env.QT_VERSION }}
        uses: jurplel/install-qt-action@v4
        with:
          version: ${{ env.QT_VERSION }}
          modules: 'qtcharts'
          setup-python: 'false'
          tools: 'tools_opensslv3_x64'
          aqtversion: '==3.1.*'  # TODO: remove when aqtinstall 3.2.2 is available

      # TODO: build with multiple threads
      - name: Build x64 release GUI
        run: |
          :: TODO: enable rules?
          :: specify Release build so matchcompiler is used
          cmake -S . -B build -Werror=dev -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=Off -DBUILD_GUI=On -DWITH_QCHART=On -DBUILD_ONLINE_HELP=On -DUSE_BOOST=ON -DBOOST_INCLUDEDIR=%GITHUB_WORKSPACE%\boost -DCMAKE_COMPILE_WARNING_AS_ERROR=On || exit /b !errorlevel!
          cmake --build build --target cppcheck-gui --config Release || exit /b !errorlevel!

      # TODO: package PDBs
      - name: Deploy app
        run: |
          windeployqt build\bin\Release || exit /b !errorlevel!
          del build\bin\Release\cppcheck-gui.ilk || exit /b !errorlevel!
          del build\bin\Release\cppcheck-gui.pdb || exit /b !errorlevel!

      - uses: actions/upload-artifact@v4
        with:
          name: deploy
          path: build\bin\Release

      - name: Matchcompiler
        run: python tools\matchcompiler.py --write-dir lib || exit /b !errorlevel!

      # TODO: build with multiple threads
      - name: Build CLI x64 release configuration using MSBuild
        run: msbuild -m cppcheck.sln -t:cli -p:Configuration=Release-PCRE -p:Platform=x64 -p:HaveBoost=HAVE_BOOST -p:BoostInclude=%GITHUB_WORKSPACE%\boost || exit /b !errorlevel!
        env:
          _CL_: /WX

      - uses: actions/upload-artifact@v4
        with:
          name: bin
          path: bin

      - name: Install missing Python packages
        run: |
          pip install -U pyinstaller || exit /b !errorlevel!

      # TODO: include in installer?
      - name: Compile misra.py executable
        run: |
          cd addons || exit /b !errorlevel!
          pyinstaller --hidden-import xml --hidden-import xml.etree --hidden-import xml.etree.ElementTree misra.py || exit /b !errorlevel!
          del *.spec || exit /b !errorlevel!

      # TODO: include in installer?
      - name: Compile cppcheck-htmlreport executable
        run: |
          cd htmlreport || exit /b !errorlevel!
          pyinstaller cppcheck-htmlreport || exit /b !errorlevel!
          del *.spec || exit /b !errorlevel!

      # TODO: test the compiled Python files

      - name: Collect files
        run: |
          @echo on
          move build\bin\Release win_installer\files || exit /b !errorlevel!
          copy AUTHORS win_installer\files\authors.txt || exit /b !errorlevel!
          copy win_installer\GPLv3.txt win_installer\files\ || exit /b !errorlevel!
          copy externals\picojson\LICENSE win_installer\files\picojson-license.txt || exit /b !errorlevel!
          copy externals\simplecpp\LICENSE win_installer\files\simplecpp-license.txt || exit /b !errorlevel!
          copy externals\tinyxml2\LICENSE win_installer\files\tinyxml2-license.txt || exit /b !errorlevel!
          copy addons\dist\misra\*.* win_installer\files\addons || exit /b !errorlevel!
          copy bin\cppcheck.exe win_installer\files || exit /b !errorlevel!
          copy bin\cppcheck-core.dll win_installer\files || exit /b !errorlevel!
          :: mkdir win_installer\files\help || exit /b !errorlevel!
          xcopy /s gui\help win_installer\files\help || exit /b !errorlevel!
          copy gui\help\online-help.qhc win_installer\files\ || exit /b !errorlevel!
          copy gui\help\online-help.qch win_installer\files\ || exit /b !errorlevel!
          del win_installer\files\cfg\*.rng || exit /b !errorlevel!
          del win_installer\files\platforms\*.rng || exit /b !errorlevel!
          del win_installer\files\translations\*.qm || exit /b !errorlevel!
          move build\gui\*.qm win_installer\files\translations || exit /b !errorlevel!
          copy htmlreport\dist\cppcheck-htmlreport\*.* win_installer\files || exit /b !errorlevel!
          :: copy libcrypto-3-x64.dll and libssl-3-x64.dll
          copy %RUNNER_WORKSPACE%\Qt\Tools\OpenSSLv3\Win_x64\bin\lib*.dll win_installer\files || exit /b !errorlevel!

      - uses: actions/upload-artifact@v4
        with:
          name: collect
          path: win_installer\files

      - name: Build Installer
        run: |
          cd win_installer || exit /b !errorlevel!
          :: Read ProductVersion
          for /f "tokens=4 delims= " %%a in ('find "ProductVersion" productInfo.wxi') do set PRODUCTVER=%%a
          :: Remove double quotes
          set PRODUCTVER=%PRODUCTVER:"=%
          @echo ProductVersion="%PRODUCTVER%" || exit /b !errorlevel!
          msbuild -m cppcheck.wixproj -p:Platform=x64,ProductVersion=%PRODUCTVER%.${{ github.run_number }} || exit /b !errorlevel!

      - uses: actions/upload-artifact@v4
        with:
          name: installer
          path: win_installer/Build/

      - name: Clean up deploy
        run: |
          @echo on
          :: del win_installer\files\addons\*.dll || exit /b !errorlevel!
          del win_installer\files\addons\*.doxyfile || exit /b !errorlevel!
          del win_installer\files\addons\*.md || exit /b !errorlevel!
          :: del win_installer\files\addons\*.pyd || exit /b !errorlevel!
          :: del win_installer\files\addons\base_library.zip || exit /b !errorlevel!
          rmdir /s /q win_installer\files\addons\test || exit /b !errorlevel!
          rmdir /s /q win_installer\files\addons\doc || exit /b !errorlevel!
          :: rmdir /s /q win_installer\files\bearer || exit /b !errorlevel!
          rmdir /s /q win_installer\files\generic || exit /b !errorlevel!
          rmdir /s /q win_installer\files\help || exit /b !errorlevel!
          rmdir /s /q win_installer\files\iconengines || exit /b !errorlevel!
          rmdir /s /q win_installer\files\imageformats || exit /b !errorlevel!
          rmdir /s /q win_installer\files\networkinformation || exit /b !errorlevel!
          :: rmdir /s /q win_installer\files\printsupport || exit /b !errorlevel!
          rmdir /s /q win_installer\files\sqldrivers || exit /b !errorlevel!      
          rmdir /s /q win_installer\files\tls || exit /b !errorlevel!
          ren win_installer\files\translations lang || exit /b !errorlevel!
          del win_installer\files\d3dcompiler_47.dll || exit /b !errorlevel!
          del win_installer\files\dxcompiler.dll || exit /b !errorlevel!
          del win_installer\files\dxil.dll || exit /b !errorlevel!
          del win_installer\files\dmake.exe || exit /b !errorlevel!
          del win_installer\files\dmake.pdb || exit /b !errorlevel!
          :: del win_installer\files\libEGL.dll || exit /b !errorlevel!
          :: del win_installer\files\libGLESv2.dll || exit /b !errorlevel!
          del win_installer\files\opengl32sw.dll || exit /b !errorlevel!
          del win_installer\files\Qt6Svg.dll || exit /b !errorlevel!
          del win_installer\files\vc_redist.x64.exe || exit /b !errorlevel!

      - uses: actions/upload-artifact@v4
        with:
          name: portable
          path: win_installer\files
