---
name: 🍎 MacOS
on:
  push:
    branches:
      - master
      - release-**
  pull_request:
  release:
    types: ['published']

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

env:
  SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }}

jobs:
  build:
    strategy:
      matrix:
        include:
          - os: macos-14
            triplet: x64-osx
            deployment-target: "10.15"
            target-arch: x86_64
          - os: macos-14
            triplet: arm64-osx
            deployment-target: "11.0"
            target-arch: arm64
    name: build (macos)
    runs-on: ${{ matrix.os }}

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

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

          BUILD_ROOT="/Users/runner"
          echo "BUILD_ROOT=${BUILD_ROOT}" >> $GITHUB_ENV
          echo "BUILD_TYPE=Release" >> $GITHUB_ENV

          echo "CMAKE_BUILD_DIR=${BUILD_ROOT}/builddir" >> $GITHUB_ENV

      - name: ⛓️ Setup SSH
        uses: webfactory/ssh-agent@v0.9.0
        if: ${{ env.SENTRY_AUTH_TOKEN != '' }}
        with:
          ssh-private-key: ${{ secrets.SSH_KEY_DEPLOYMENT_CERTIFICATES }}

      - name: 💎 Setup ruby
        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: 🔏 Setup code signing
        if: ${{ env.SENTRY_AUTH_TOKEN != '' }}
        env:
          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
        run: |
          bundle install
          bundle exec fastlane ios setup_signing type:development app_identifier:ch.opengis.qfield #  --verbose

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

      - name: 🔨 Prepare build env
        run: |
          brew install automake bison flex gnu-sed create-dmg autoconf-archive nasm libtool
          echo $(brew --prefix bison)/bin >> $GITHUB_PATH
          echo $(brew --prefix flex)/bin >> $GITHUB_PATH
          echo $(brew --prefix libtool)/bin >> $GITHUB_PATH

      - name: 🐩 Install CMake and Ninja
        uses: lukka/get-cmake@latest
        with:
          cmakeVersion: 3.29.0
      - name: 🍭 Setup XCode
        uses: maxim-lobanov/setup-xcode@v1.6.0
        with:
          xcode-version: latest-stable

      - name: 🍮 ccache
        uses: hendrikmuhs/ccache-action@v1.2.11
        with:
          key: ccache-${{ matrix.triplet }}-qt6
          max-size: 200M

      - name: 🐍 Setup Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.10'

      - name: 🌱 Install dependencies and generate project files
        run: |
          source ./scripts/version_number.sh
          source ./scripts/ci/generate-version-details.sh

          cmake -S "${{ github.workspace }}" \
                -B "${CMAKE_BUILD_DIR}" \
                -G Xcode \
                -D CMAKE_BUILD_TYPE=${{ env.BUILD_TYPE }} \
                -D WITH_VCPKG=ON \
                -D WITH_NFC=OFF \
                -D WITH_SPIX=ON \
                -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 MACOS_CODE_SIGN_IDENTITY="Apple Development" \
                -D CMAKE_CXX_VISIBILITY_PRESET=hidden \
                -D CMAKE_OSX_DEPLOYMENT_TARGET=${{ matrix.deployment-target }} \
                -D CMAKE_OSX_ARCHITECTURES=${{ matrix.target-arch }} \
                -D VCPKG_TARGET_TRIPLET=${{ matrix.triplet }} \
                -D WITH_CCACHE=ON

      - name: 🌋 Build
        run: |
          # https://www.reddit.com/r/MacOS/comments/f37ybt/osascript_cant_open_default_scripting_component/?utm_medium=android_app&utm_source=share
          sudo rm -rf /Library/Audio/Plug-Ins/Components
          cmake --build "${{ env.CMAKE_BUILD_DIR }}" --config ${{ env.BUILD_TYPE }}

      - name: 🧫 Test
        env:
          PROJ_LIB: ${{ env.CMAKE_BUILD_DIR }}/vcpkg_installed/${{ matrix.triplet }}/share/proj
          QFIELD_SYSTEM_SHARED_DATA_PATH: ${{ env.CMAKE_BUILD_DIR }}/vcpkg_installed/${{ matrix.triplet }}/share
        run: |
          pip install -r "${{ github.workspace }}/test/spix/requirements.txt"
          cd "${{ env.CMAKE_BUILD_DIR }}"
          ctest --output-on-failure -R smoke -C ${{ env.BUILD_TYPE }}

      - name: 📦 Package
        env:
          MATCH_PASSWORD: ${{ secrets.MATCH_PASSWORD }}
        run: |
          echo "Killing XProtect..."; sudo pkill -9 XProtect >/dev/null || true; # see https://github.com/actions/runner-images/issues/7522
          cmake --build  "${{ env.CMAKE_BUILD_DIR }}" --target bundle --config ${{ env.BUILD_TYPE }}
          echo "ARTIFACT_PATHNAME=${{ env.CMAKE_BUILD_DIR }}/QField-Installer.dmg" >> $GITHUB_ENV
          echo "ARTIFACT_NAME=qfield-${{ env.CI_PACKAGE_FILE_SUFFIX }}-${{ matrix.triplet }}.dmg" >> $GITHUB_ENV

      - name: 📦 Upload package
        uses: actions/upload-artifact@v4
        with:
          name: "QField-dev-${{ matrix.triplet }}-experimental-qt6"
          path: ${{ env.CMAKE_BUILD_DIR }}/QField-Installer.dmg

      - name: 📊 Upload test report
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: "test-report-${{ matrix.triplet }}-${{ 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: 📑 Upload logs
        uses: actions/upload-artifact@v4
        if: failure()
        with:
          name: logs-${{ matrix.triplet }}
          path: |
            ${{ env.CMAKE_BUILD_DIR }}/**/*.log

      - name: 📮 Upload debug symbols
        if: ${{ env.SENTRY_AUTH_TOKEN != '' }}
        # if: release or labeled PR
        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 }}
