name: Packaging(Windows)

on:
  push:
    branches:
      - master
      - fix*
    paths-ignore:
      - 'README.md'
      - 'LICENSE'
      - 'docs/**'

  pull_request:
    paths-ignore:
      - 'README.md'
      - 'LICENSE'
      - 'docs/**'
      - 'data/translations/*.ts'
  
  workflow_dispatch:


env:
  PRODUCT: flameshot

jobs:
  windows-pack:
    name: VS 2022 ${{ matrix.config.arch }}-${{ matrix.type }}
    runs-on: windows-2025
    env:
      VCINSTALLDIR: C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC
      # 2025.02.14
      VCPKG_VERSION: d5ec528843d29e3a52d745a64b469f810b2cedbf
      VCPKG_PACKAGES: openssl-windows
      OPENSSL_ROOT_DIR: ${{ github.workspace }}\vcpkg\installed\${{ matrix.config.vcpkg_triplet }}\
    strategy:
      fail-fast: false
      matrix:
        qt_ver: [6.9.1]
        qt_target: [desktop]
        config:
          - {
            arch: x64,
            generator: "-G'Visual Studio 17 2022' -A x64",
            vcpkg_triplet: x64-windows,
            qt_arch: win64_msvc2022_64,
            qt_arch_install: msvc2022_64,
            pak_arch: win64
          }
        type: [portable, installer]
    steps:
      - name: Checkout Source code
        if: github.event_name == 'push'
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
#          ref: master

      - name: Checkout Source code
        if: github.event_name == 'pull_request'
        uses: actions/checkout@v4
        with:
          fetch-depth: 0
          ref: ${{ github.event.pull_request.head.sha }}

      - name: Checkout Source code
        if: github.event_name == 'workflow_dispatch'
        uses: actions/checkout@v4
        with:
          ref: ${{ github.sha }}

      - name: Fix Python path
        shell: pwsh
        run: |
          Remove-Item "$env:LOCALAPPDATA\Microsoft\WindowsApps\python*.exe" -Force -ErrorAction SilentlyContinue

      - name: Set env & Print flameshot version
        shell: bash
        run: |
          last_committed_tag=$(git tag -l --sort=-v:refname | head -1)
          git_revno=$(git rev-list $(git describe --tags --abbrev=0)..HEAD --count)
          git_hash=$(git rev-parse --short HEAD)
          ver_info=${last_committed_tag}+git${git_revno}.${git_hash}
          echo "=======FLAMESHOT VERSION========"
          echo ${last_committed_tag:1}
          echo "Details: ${ver_info}"
          echo "================================"
          # This will allow to build pre-preleases without git tag
          # echo "VERSION=${last_committed_tag:1}" >> $GITHUB_ENV
          echo "VERSION=$(cat CMakeLists.txt |grep 'set.*(.*FLAMESHOT_VERSION' | sed 's/[^0-9.]*//' |sed 's/)//g')" >> $GITHUB_ENV
          echo "VER_INFO=${ver_info}" >> $GITHUB_ENV

      - name: Restore from cache and run vcpkg
        uses: lukka/run-vcpkg@v11
        with:
          vcpkgArguments: ${{env.VCPKG_PACKAGES}}
          vcpkgDirectory: '${{ github.workspace }}\vcpkg'
          appendedCacheKey: ${{ matrix.config.vcpkg_triplet }}
          vcpkgGitCommitId: ${{ env.VCPKG_VERSION }}
          vcpkgTriplet: ${{ matrix.config.vcpkg_triplet }}

      - name: Install Qt
        uses: jurplel/install-qt-action@v4
        with:
          version: ${{ matrix.qt_ver }}
          cache: 'true'
          cache-key-prefix: install-qt-action-${{ matrix.qt_ver }}
          target:  ${{ matrix.qt_target }}
          arch: ${{ matrix.config.qt_arch }}
          modules: 'qtimageformats'
          dir: '${{ github.workspace }}/build/'

      - name: Configure
        working-directory: build
        shell: pwsh
        run: |
          cmake ..  ${{matrix.config.generator}}  `
          -DCMAKE_TOOLCHAIN_FILE="${{ github.workspace }}\vcpkg\scripts\buildsystems\vcpkg.cmake"  `
          -DENABLE_OPENSSL=ON `
          -DCMAKE_BUILD_TYPE=Release  `
          -DRUN_IN_PLACE=${{ contains(matrix.type, 'portable') }}

      - name: Compile
        working-directory: build
        shell: pwsh
        run: cmake --build . --config Release

      - name: CPack
        working-directory: build
        shell: pwsh
        run: |
          # Chocolately made their own package called cpack and its first in the path. This is a hack since we are only using cmake's cpack, doesn't seem to be required after a CI update
          #Remove-Item C:\ProgramData\Chocolatey\bin\cpack.exe
          If ($env:TYPE -eq "installer")
          {
            cpack -G WIX -B "$env:GITHUB_WORKSPACE\build\Package"
          }
          ElseIf($env:TYPE -eq "portable")
          {
            cpack -G ZIP -B "$env:GITHUB_WORKSPACE\build\Package"
          }
        env:
          TYPE: ${{matrix.type}}

      - name: Package Clean
        shell: pwsh
        run: |
          # Remove-Item $env:GITHUB_WORKSPACE\build\Package\_CPack_Packages -Recurse
          New-Item -Path $env:GITHUB_WORKSPACE\build\Package\installer -ItemType Directory
          New-Item -Path $env:GITHUB_WORKSPACE\build\Package\portable -ItemType Directory

      - name: Package Prepare (installer)
        if:  matrix.type == 'installer'
        shell: pwsh
        run: |
          Move-Item -Path $env:GITHUB_WORKSPACE/build/Package/Flameshot-*-${{ matrix.config.pak_arch }}.msi -Destination $env:GITHUB_WORKSPACE/build/Package/installer/Flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.msi

      - name: Package Prepare (portable)
        if:  matrix.type == 'portable'
        shell: pwsh
        run: |
          Move-Item -Path $env:GITHUB_WORKSPACE/build/Package/flameshot-*-${{ matrix.config.pak_arch }}.zip -Destination $env:GITHUB_WORKSPACE/build/Package/portable/flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.zip

      - name: SHA256Sum of Windows installer
        if:  matrix.type == 'installer'
        shell: bash
        run: |
          sha256sum $GITHUB_WORKSPACE/build/Package/installer/Flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.msi
          sha256sum $GITHUB_WORKSPACE/build/Package/installer/Flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.msi > $GITHUB_WORKSPACE/build/Package/installer/Flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.msi.sha256sum

      - name: SHA256Sum of Windows portable
        if:  matrix.type == 'portable'
        shell: bash
        run: |
          sha256sum $GITHUB_WORKSPACE/build/Package/portable/flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.zip
          sha256sum $GITHUB_WORKSPACE/build/Package/portable/flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.zip > $GITHUB_WORKSPACE/build/Package/portable/flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.zip.sha256sum

      - name: Artifact Upload
        if:  matrix.type == 'installer'
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-win-${{ matrix.config.arch }}-${{ matrix.type }}
          path: |
            ${{ github.workspace }}/build/Package/installer/Flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.msi
            ${{ github.workspace }}/build/Package/installer/Flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.msi.sha256sum
          overwrite: true

      - name: Artifact Upload
        if:  matrix.type == 'portable'
        uses: actions/upload-artifact@v4
        with:
          name: ${{ env.PRODUCT }}-${{ env.VER_INFO }}-artifact-win-${{ matrix.config.arch }}-${{ matrix.type }}
          path: |
            ${{ github.workspace }}/build/Package/portable/flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.zip
            ${{ github.workspace }}/build/Package/portable/flameshot-${{ env.VERSION }}-${{ matrix.config.pak_arch }}.zip.sha256sum
          overwrite: true
