---
name: 🪟 Windows
on:
  push:
    branches:
      - master
      - release-**
  pull_request:
  release:
    types: ['published']
  workflow_dispatch:

concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

jobs:
  build:
    name: build (windows)
    runs-on: windows-2022

    outputs:
      artifact_name: ${{ steps.package.outputs.artifact_name }}

    steps:
      - name: 🐣 Checkout
        uses: actions/checkout@v4
        with:
          submodules: recursive

      - name: 🌾 Prepare vars
        id: vars
        shell: bash
        run: |
          ./scripts/ci/env_gh.sh

          echo "BUILD_TYPE=Release" >> $GITHUB_ENV
          echo "CMAKE_BUILD_DIR=C:/builddir" >> $GITHUB_ENV

      - name: 🐩 Install CMake and Ninja
        uses: lukka/get-cmake@latest
        with:
          cmakeVersion: 3.29.0

      - name: 🧽 Developer Command Prompt for Microsoft Visual C++
        uses: ilammy/msvc-dev-cmd@v1
        # with:
          # See https://github.com/actions/runner-images/issues/9398
          # toolset: 14.39

      - name: 🔨 Prepare build env
        shell: bash
        run: |
          # Hide terminal for release builds
          if [[ -n "${{ env.CI_TAG }}" ]]; then
            EXTRA_CMAKE_ARGS="${EXTRA_CMAKE_ARGS} -DCMAKE_WIN32_EXECUTABLE=ON"
          fi
          echo "EXTRA_CMAKE_ARGS=${EXTRA_CMAKE_ARGS}" >> $GITHUB_ENV

      - name: 🌱 Install dependencies and generate project files
        shell: bash
        env:
          WORKSPACE: ${{ github.workspace }}
        run: |
          # Convert paths to bash compatible ones. Thanks to whoever decided to use drive letters and backslashes.
          CMAKE_BUILD_DIR=$( cygpath "${CMAKE_BUILD_DIR}" )
          SOURCE_DIR=$( cygpath "${WORKSPACE}" )

          source ./scripts/version_number.sh
          source ./scripts/ci/generate-version-details.sh

          cmake -S "${SOURCE_DIR}" \
                -G Ninja \
                -B "${CMAKE_BUILD_DIR}" \
                -D CMAKE_C_COMPILER="C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/Llvm/x64/bin/clang-cl.exe" \
                -D CMAKE_CXX_COMPILER="C:/Program Files/Microsoft Visual Studio/2022/Enterprise/VC/Tools/Llvm/x64/bin/clang-cl.exe" \
                -D CMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
                -D VCPKG_TARGET_TRIPLET="x64-windows-static" \
                -D VCPKG_HOST_TRIPLET="x64-windows-static" \
                -D WITH_VCPKG=ON \
                -D WITH_SPIX=ON \
                -D WITH_NFC=OFF \
                -D APP_VERSION="${APP_VERSION}" \
                -D APP_VERSION_STR="${APP_VERSION_STR}" \
                -D APP_PACKAGE_NAME="${APP_PACKAGE_NAME}" \
                -D ENABLE_TESTS=ON \
                -D NUGET_USERNAME=opengisch \
                -D NUGET_TOKEN=${{ secrets.GITHUB_TOKEN }} \
                -D SENTRY_DSN=${{ secrets.SENTRY_DSN }} \
                -D SENTRY_ENV="${APP_ENV}" \
                -D CMAKE_MSVC_RUNTIME_LIBRARY="MultiThreaded\$<\$<CONFIG:Debug>:Debug>" \
                -D PKG_CONFIG_EXECUTABLE=${CMAKE_BUILD_DIR}/vcpkg_installed/x64-windows-static/tools/pkgconf/pkgconf.exe \
                -D WITH_BLUETOOTH=ON \
                -D VCPKG_INSTALL_OPTIONS="--x-buildtrees-root=C:/src" \
                -D CMAKE_COMPILE_WARNING_AS_ERROR=ON \
                ${EXTRA_CMAKE_ARGS}

      - name: 📑 Upload dep build logs
        uses: actions/upload-artifact@v4
        if: failure()
        with:
          name: build-logs-x64-windows-static
          path: |
            C:/src/**/*.log

      - name: Fix openh264 linking
        run: |
          sed -i 's/ openh264\.lib //g' /c/builddir/build.ninja

      - name: 🌋 Build
        run: |
          cmake --build "${{ env.CMAKE_BUILD_DIR }}" --config ${{ env.BUILD_TYPE }}

      - name: 🧫 Test
        shell: bash
        env:
          PROJ_LIB: ${{ env.CMAKE_BUILD_DIR }}/vcpkg_installed/x64-windows-static/share/proj
        run: |
          SOURCE_DIR=$( cygpath "${{ github.workspace }}" )
          pip install -r "${SOURCE_DIR}/test/spix/requirements.txt"
          cd "${{ env.CMAKE_BUILD_DIR }}"
          ctest --output-on-failure -C ${{ env.BUILD_TYPE }} -E qmltest

      - name: Package
        id: package
        shell: bash
        run: |
          cmake --build  "${{ env.CMAKE_BUILD_DIR }}" --target bundle --config ${{ env.BUILD_TYPE }} -j1
          ARTIFACT_PATHNAME=$(ls ${{ env.CMAKE_BUILD_DIR }}/QField-*-win64.* | head -n 1)
          ARTIFACT_NAME=$(basename $ARTIFACT_PATHNAME)
          echo "ARTIFACT_PATHNAME=${ARTIFACT_PATHNAME}" >> $GITHUB_ENV
          echo "ARTIFACT_NAME=qfield-${{ env.CI_PACKAGE_FILE_SUFFIX }}-windows-x64.exe" >> $GITHUB_ENV

          echo "artifact_name=${ARTIFACT_NAME}" >> "$GITHUB_OUTPUT"

      - name: 📑 Upload logs
        uses: actions/upload-artifact@v4
        if: failure()
        with:
          name: package-logs-x64-windows-static
          path: |
            ${{ env.CMAKE_BUILD_DIR }}/_CPack_Packages/**/*.log
            ${{ env.CMAKE_BUILD_DIR }}/CMakeCache.txt

      - name: 🎭 Sign
        if: ( github.event_name == 'release'  && startsWith(github.ref, 'refs/tags/v') ) || github.event_name == 'workflow_dispatch' && env.ARTIFACT_NAME != null
        uses: azure/trusted-signing-action@v0.5.0
        with:
          azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          azure-client-id: ${{ secrets.AZURE_CLIENT_ID }}
          azure-client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}
          endpoint: https://weu.codesigning.azure.net/
          code-signing-account-name: OPENGISch
          certificate-profile-name: OPENGISch
          files-folder: ${{ env.CMAKE_BUILD_DIR }}
          files-folder-filter: exe,msi
          file-digest: SHA256
          timestamp-rfc3161: http://timestamp.acs.microsoft.com
          timestamp-digest: SHA256

      - name: 📦 Upload package
        if: ${{ env.ARTIFACT_NAME != null }}
        uses: actions/upload-artifact@v4
        with:
          name: "QField-dev-x64-windows-static-${{ env.BUILD_TYPE }}"
          path: ${{ env.ARTIFACT_PATHNAME }}

      - name: 📊 Upload test report
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: "test-report-x64-windows-static-${{ env.BUILD_TYPE }}"
          path: "${{ env.CMAKE_BUILD_DIR }}/report"

      - name: 🚀 Upload release asset
        if: github.event_name == 'release' && startsWith(github.ref, 'refs/tags/v') && env.ARTIFACT_NAME != null
        uses: shogo82148/actions-upload-release-asset@v1
        with:
          upload_url: ${{ github.event.release.upload_url }}
          asset_path: ${{ env.ARTIFACT_PATHNAME }}
          asset_name: ${{ env.ARTIFACT_NAME }}
          overwrite: true

      - name: 💎 Setup ruby
        if: github.event_name == 'release' && startsWith(github.ref, 'refs/tags/v')
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.2' # Not needed with a .ruby-version file
          bundler-cache: true # runs 'bundle install' and caches installed gems automatically

      - name: 🍺 Upload to S3
        if: github.event_name == 'release' && startsWith(github.ref, 'refs/tags/v')
        env:
          S3_BUCKET: qfieldapks
          S3_REGION: ch-dk-2
          S3_ACCESS_KEY: ${{ secrets.S3_ACCESS_KEY}}
          S3_SECRET_ACCESS_KEY: ${{ secrets.S3_SECRET_ACCESS_KEY}}
        run: |
          bundle exec fastlane windows upload_s3 exe:${{ env.ARTIFACT_PATHNAME }}

      - name: 📮 Upload debug symbols
        if: github.event_name == 'release' && startsWith(github.ref, 'refs/tags/v') && env.ARTIFACT_NAME != null
        env:
          SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}
          SENTRY_ORG_SLUG: opengisch
          SENTRY_PROJECT_SLUG: qfield
        run: |
          bundle exec fastlane run sentry_debug_files_upload path:${{ env.CMAKE_BUILD_DIR }}

  deploy:
    name: deploy (ms store)
    runs-on: windows-2022

    if: github.event_name == 'release' && startsWith(github.ref, 'refs/tags/v')

    needs: build

    steps:
      - name: Configure Store Credentials
        uses: microsoft/store-submission@v1
        with:
          command: configure
          type: win32
          seller-id: ${{ secrets.MICROSOFT_STORE_SELLER_ID }}
          product-id: ${{ secrets.MICROSOFT_STORE_PRODUCT_ID }}
          tenant-id: ${{ secrets.AZURE_TENANT_ID }}
          client-id: ${{ secrets.AZURE_CLIENT_ID }}
          client-secret: ${{ secrets.AZURE_CLIENT_SECRET }}

      - name: Update Draft Submission
        uses: microsoft/store-submission@v1
        with:
          command: update
          # See documentation here https://learn.microsoft.com/en-us/windows/apps/publish/store-submission-api#update-current-draft-submission-metadata-api
          product-update: '{"packages":[{"packageUrl":"https://sos-ch-dk-2.exo.io/qfieldapks/releases/files/${{ needs.build.outputs.artifact_name }}","languages":["en"],"architectures":["X64"],"isSilentInstall":false,"installerParameters":"/S","packageType":"exe","genericDocUrl":"https://nsis.sourceforge.io/Docs/AppendixD.html#errorlevels"}]}'

      - name: Publish Submission
        uses: microsoft/store-submission@v1
        with:
          command: publish
