name: 📣 Build release of QOwnNotes

on:
  workflow_dispatch:
  push:
    branches:
      - release
    tags-ignore:
      - "*"

defaults:
  run:
    working-directory: src

#--------------------------------------------------------------------------------
# Define application name & version
#--------------------------------------------------------------------------------

env:
  EXECUTABLE: "QOwnNotes"
  APPLICATION: "QOwnNotes"
  UNIXNAME: "QOwnNotes"
  QMAKE_PROJECT: "QOwnNotes.pro"
  PUBLISHER: "Patrizio Bekerle"
  REPO_DIR: "/home/runner/work/QOwnNotes"
  QT_MODULES: ""
  QT6_MODULES: "qtwebsockets"
  QMAKE: qmake
  CORES: 16

jobs:
  create_release:
    name: "🗃️️ Prepare release"
    permissions:
      contents: write # for actions/create-release to create a release
    runs-on: ubuntu-latest
    outputs:
      upload_url: ${{ steps.create_release.outputs.upload_url }}
      release_id: ${{ steps.create_release.outputs.id }}
    steps:
      - uses: actions/checkout@v6
      - name: Set Env
        run: |
          export VERSION=$(cat version.h | sed 's/[^0-9,.]//g')
          #export TAG=v${VERSION}.${GITHUB_RUN_ID}.${GITHUB_RUN_NUMBER}
          export TAG=v${VERSION}
          export RELEASE_TEXT=$(grep -Pzo "## ${VERSION}\n(\n|.)+?\n##" ../CHANGELOG.md | sed '$ d')
          echo "VERSION=${VERSION}" >> $GITHUB_ENV
          echo "TAG=${TAG}" >> $GITHUB_ENV
          # add multiline release text
          echo "RELEASE_TEXT<<EOF" >> $GITHUB_ENV
          echo "${RELEASE_TEXT}" >> $GITHUB_ENV
          echo "EOF" >> $GITHUB_ENV
      - name: Printenv
        run: |
          echo "VERSION=${VERSION}"
          echo "TAG=${TAG}"
          echo "RELEASE_TEXT=${RELEASE_TEXT}"
          printenv
      - name: Create release
        id: create_release
        uses: softprops/action-gh-release@v2
        with:
          tag_name: ${{ env.TAG }}
          name: Release v${{ env.VERSION }}
          body: ${{ env.RELEASE_TEXT }}
          # we want other build systems to immediately use this release after we uploaded the source archive
          draft: false
          prerelease: false
          generate_release_notes: false

  #--------------------------------------------------------------------------------
  # Workflow jobs (GNU/Linux, macOS & Windows)
  #--------------------------------------------------------------------------------

  #
  # AppImage build
  #
  build-appimage:
    needs: create_release
    runs-on: ubuntu-22.04
    env:
      QT_VERSION: 5.15.2
      BUILD_DIR: build
    name: "🐧 AppImage Qt 5.15.2"
    steps:
      - name: "🧰 Checkout"
        uses: actions/checkout@v6
        with:
          submodules: recursive

      - name: "⚙️ Install Qt"
        uses: jurplel/install-qt-action@v4
        with:
          version: ${{env.QT_VERSION}}
          modules: ${{env.QT_MODULES}}
          cache: true

      - name: "⚙️ Install dependencies"
        run: |
          sudo apt-get update
          sudo apt install desktop-file-utils libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-composite0 libxcb-cursor0 libxcb-damage0 libxcb-dpms0 libxcb-dri2-0 libxcb-dri3-0 libxcb-ewmh2 libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-record0 libxcb-render0 libxcb-res0 libxcb-screensaver0 libxcb-shape0 libxcb-shm0 libxcb-sync1 libxcb-util1 libxkbcommon-x11-0
      - name: "🚧 Compile application"
        run: |
          echo "#define RELEASE \"AppImage\"" > release.h
          ${{env.QMAKE}} ${{env.QMAKE_PROJECT}} CONFIG+=release PREFIX=/usr
          lrelease QOwnNotes.pro
          make -j${{env.CORES}}
      - name: "⚙️ Install linuxdeploy"
        run: |
          wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
          wget https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage
          chmod +x linuxdeploy-x86_64.AppImage
          chmod +x linuxdeploy-plugin-qt-x86_64.AppImage
      - name: "📦 Create AppImage"
        run: |
          export QMAKE=${{env.REPO_DIR}}/Qt/${{env.QT_VERSION}}/gcc_64/bin/${{env.QMAKE}}
          export PATH=${{env.REPO_DIR}}/Qt/${{env.QT_VERSION}}/gcc_64/libexec:$PATH
          export EXTRA_QT_PLUGINS="svg;"
          cp ../icons/icon.png QOwnNotes.png
          ./linuxdeploy-x86_64.AppImage --appdir ${{env.BUILD_DIR}} -e ${{env.UNIXNAME}} -i ${{env.UNIXNAME}}.png -d PBE.QOwnNotes.desktop --plugin qt
          mkdir -p ${{env.BUILD_DIR}}/usr/languages && cp -r languages/*.qm ${{env.BUILD_DIR}}/usr/languages
          find ${{env.BUILD_DIR}}
          ./linuxdeploy-x86_64.AppImage --appdir ${{env.BUILD_DIR}} --output appimage
          rm linuxdeploy-x86_64.AppImage
          rm linuxdeploy-plugin-qt-x86_64.AppImage
          ls -hal *.AppImage
          find -iname "*.AppImage"
          mv *.AppImage ${{env.EXECUTABLE}}-x86_64.AppImage || true
          sha256sum ${{env.EXECUTABLE}}-x86_64.AppImage > ${{env.EXECUTABLE}}-x86_64.AppImage.sha256sum
          ls -hal *.AppImage
          find -iname "*.AppImage"
          pwd

      #      - name: '📤 Upload artifact: AppImage'
      #        uses: actions/upload-artifact@v4
      #        with:
      #          name: ${{env.EXECUTABLE}}-x86_64.AppImage
      #          path: src/${{env.EXECUTABLE}}-x86_64.AppImage
      #      - name: '📤 Upload artifact: AppImage sha256sum'
      #        uses: actions/upload-artifact@v4
      #        with:
      #          name: ${{env.EXECUTABLE}}-x86_64.AppImage.sha256sum
      #          path: src/${{env.EXECUTABLE}}-x86_64.AppImage.sha256sum
      - name: "📤 Release AppImage for Linux"
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create_release.outputs.upload_url }}
          asset_path: ./src/QOwnNotes-x86_64.AppImage
          asset_name: QOwnNotes-x86_64.AppImage
          asset_content_type: application/vnd.appimage
      - name: "📤 Release AppImage sha256sum"
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create_release.outputs.upload_url }}
          asset_path: ./src/QOwnNotes-x86_64.AppImage.sha256sum
          asset_name: QOwnNotes-x86_64.AppImage.sha256sum
          asset_content_type: text/plain

  #
  # AppImage Qt6 build
  #
  build-appimage-qt6:
    needs: create_release
    runs-on: ubuntu-22.04
    env:
      QT_VERSION: 6.5.3
      BUILD_DIR: build
      APPIMAGE_NAME: "QOwnNotes-x86_64-Qt6-experimental.AppImage"
    name: "🐧 AppImage Qt 6.5.3"
    steps:
      - name: "🧰 Checkout"
        uses: actions/checkout@v6
        with:
          submodules: recursive

      - name: "⚙️ Install Qt"
        uses: jurplel/install-qt-action@v4
        with:
          version: ${{env.QT_VERSION}}
          modules: ${{env.QT6_MODULES}}
          aqtversion: "==2.0.0"
          cache: true

      - name: "⚙️ Install dependencies"
        run: |
          sudo apt-get update
          # sudo apt-get install libgl1-mesa-dev libxkbcommon-x11-0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libzstd-dev
          sudo apt install desktop-file-utils libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 libxcb-xinerama0 libxcb-composite0 libxcb-cursor0 libxcb-damage0 libxcb-dpms0 libxcb-dri2-0 libxcb-dri3-0 libxcb-ewmh2 libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-record0 libxcb-render0 libxcb-res0 libxcb-screensaver0 libxcb-shape0 libxcb-shm0 libxcb-sync1 libxcb-util1 libxkbcommon-x11-0
      - name: "🚧 Compile application"
        run: |
          echo "#define RELEASE \"AppImage\"" > release.h
          ${{env.QMAKE}} ${{env.QMAKE_PROJECT}} CONFIG+=release PREFIX=/usr
          lrelease QOwnNotes.pro
          make -j${{env.CORES}}
      - name: "⚙️ Install linuxdeploy"
        run: |
          wget https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-x86_64.AppImage
          wget https://github.com/linuxdeploy/linuxdeploy-plugin-qt/releases/download/continuous/linuxdeploy-plugin-qt-x86_64.AppImage
          chmod +x linuxdeploy-x86_64.AppImage
          chmod +x linuxdeploy-plugin-qt-x86_64.AppImage
      - name: "📦 Create AppImage"
        run: |
          export QMAKE=${{env.REPO_DIR}}/Qt/${{env.QT_VERSION}}/gcc_64/bin/${{env.QMAKE}}
          export PATH=${{env.REPO_DIR}}/Qt/${{env.QT_VERSION}}/gcc_64/libexec:$PATH
          cp ../icons/icon.png QOwnNotes.png
          ./linuxdeploy-x86_64.AppImage --appdir ${{env.BUILD_DIR}} -e ${{env.UNIXNAME}} -i ${{env.UNIXNAME}}.png -d PBE.QOwnNotes.desktop --plugin qt
          mkdir -p ${{env.BUILD_DIR}}/usr/plugins/iconengines && cp -r ${{env.REPO_DIR}}/Qt/${{env.QT_VERSION}}/gcc_64/plugins/iconengines/libqsvgicon.so ${{env.BUILD_DIR}}/usr/plugins/iconengines
          mkdir -p ${{env.BUILD_DIR}}/usr/languages && cp -r languages/*.qm ${{env.BUILD_DIR}}/usr/languages
          cp -rL ${{env.REPO_DIR}}/Qt/${{env.QT_VERSION}}/gcc_64/lib/libQt6QmlWorkerScript.so.6 ${{env.BUILD_DIR}}/usr/lib
          find ${{env.BUILD_DIR}}
          ./linuxdeploy-x86_64.AppImage --appdir ${{env.BUILD_DIR}} --output appimage
          rm linuxdeploy-x86_64.AppImage
          rm linuxdeploy-plugin-qt-x86_64.AppImage
          ls -hal *.AppImage
          find -iname "*.AppImage"
          # It's ok if no file needs to be renamed
          mv *.AppImage ${{env.APPIMAGE_NAME}} ||:
          sha256sum ${{env.APPIMAGE_NAME}} > ${{env.APPIMAGE_NAME}}.sha256sum
          ls -hal *.AppImage
          find -iname "*.AppImage"
          pwd

      - name: "📤 Release AppImage Qt6 for Linux"
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create_release.outputs.upload_url }}
          asset_path: ./src/${{env.APPIMAGE_NAME}}
          asset_name: ${{env.APPIMAGE_NAME}}
          asset_content_type: application/vnd.appimage
      - name: "📤 Release AppImage Qt6 sha256sum"
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create_release.outputs.upload_url }}
          asset_path: ./src/${{env.APPIMAGE_NAME}}.sha256sum
          asset_name: ${{env.APPIMAGE_NAME}}.sha256sum
          asset_content_type: text/plain

  #
  # Snap build
  #
  build-snap:
    needs: create_release
    runs-on: ubuntu-latest
    env:
      QT_VERSION: 5.15.2
    name: "🐧 Snap Qt 5.15.2"
    steps:
      - name: "🧰 Checkout"
        uses: actions/checkout@v6
        with:
          submodules: recursive

      - name: "⚙️ Set Env"
        shell: bash
        run: |
          export VERSION=$(cat version.h | sed 's/[^0-9,.]//g')
          echo "VERSION=${VERSION}" >> $GITHUB_ENV

      - name: "⚙️ Install Qt"
        uses: jurplel/install-qt-action@v4
        with:
          version: ${{env.QT_VERSION}}
          modules: ${{env.QT_MODULES}}
          cache: true

      - name: "⚙️ Printenv"
        shell: bash
        run: |
          echo "VERSION=${VERSION}"
          printenv

      - name: "🚧 Compile application"
        uses: snapcore/action-build@v1
        id: snapcraft

      - name: "📤 Release Snap for Linux"
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create_release.outputs.upload_url }}
          asset_path: ./qownnotes_${{ env.VERSION }}_amd64.snap
          asset_name: QOwnNotes-amd64.snap
          asset_content_type: application/octet-stream

      - name: "📤 Deploy Snap"
        uses: snapcore/action-publish@v1
        continue-on-error: true
        env:
          # `snapcraft export-login --snaps=qownnotes --acls package_access,package_push,package_update,package_release -`, token valid for one year
          SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAP_TOKEN_GH }}
        with:
          snap: /home/runner/work/QOwnNotes/QOwnNotes/qownnotes_${{ env.VERSION }}_amd64.snap
          release: stable

  #      - name: '📤 Upload artifact: Snap'
  #        uses: actions/upload-artifact@v4
  #        with:
  #          name: qownnotes_${{ env.VERSION }}_amd64.snap
  #          path: /home/runner/work/QOwnNotes/QOwnNotes/qownnotes_${{ env.VERSION }}_amd64.snap

  #
  # Windows build
  #
  build-windows:
    name: "🧊 Windows Qt6"
    needs: create_release
    # https://github.com/pbek/QOwnNotes/issues/2558 error on windows-2022!
    runs-on: windows-2025
    env:
      # Qt 6.5 windeployqt doesn't deploy DLLs!
      QT_VERSION: 6.9.1
    steps:
      - name: "🧰 Checkout"
        uses: actions/checkout@v6
        with:
          submodules: recursive

      - name: "⚙️ Install Qt"
        uses: jurplel/install-qt-action@v4
        with:
          version: ${{env.QT_VERSION}}
          # https://download.qt.io/online/qtsdkrepository/windows_x86/desktop/qt6_650/qt.qt6.650.win64_mingw/
          # https://aqtinstall.readthedocs.io/en/latest/getting_started.html
          # https://ddalcino.github.io/aqt-list-server/
          modules: ${{env.QT6_MODULES}}
          cache: true

      - name: "⚙️ Set Env"
        shell: bash
        run: |
          export VERSION=$(cat version.h | sed 's/[^0-9,.]//g')
          echo "VERSION=${VERSION}" >> $GITHUB_ENV

      - name: Make sure MSVC is found
        uses: ilammy/msvc-dev-cmd@v1

      - name: "⚙️ Printenv"
        shell: bash
        run: |
          echo "VERSION=${VERSION}"
          printenv

      - name: "🚧 Compile application"
        run: '& ..\build-systems\github\windows\build-zip-qt6.ps1'

      #      - name: '📤 Upload artifact: Windows'
      #        uses: actions/upload-artifact@v4
      #        with:
      #          name: QOwnNotes.zip
      #          path: QOwnNotes.zip
      #      - name: '📤 Upload artifact: Windows sha256sum'
      #        uses: actions/upload-artifact@v4
      #        with:
      #          name: QOwnNotes.zip.sha256
      #          path: QOwnNotes.zip.sha256

      - name: "📤 Release ZIP"
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create_release.outputs.upload_url }}
          asset_path: QOwnNotes.zip
          asset_name: QOwnNotes.zip
          asset_content_type: application/zip
      - name: "📤 Release sha256 sum"
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create_release.outputs.upload_url }}
          asset_path: QOwnNotes.zip.sha256
          asset_name: QOwnNotes.zip.sha256
          asset_content_type: text/plain
      - name: "📤 Release clickable sha256 sum"
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create_release.outputs.upload_url }}
          asset_path: QOwnNotes.zip.sha256sum
          asset_name: QOwnNotes.zip.sha256sum
          asset_content_type: text/plain

  #
  # macOS Qt6 build
  #
  build-macos:
    name: "🍎 macOS Qt6"
    needs: create_release
    runs-on: macos-15
    env:
      # Qt 6.5 doesn't support macOS 10 anymore!
      QT_VERSION: 6.9.1
    steps:
      - name: "🧰 Checkout"
        uses: actions/checkout@v6
        with:
          submodules: recursive

      # https://download.qt.io/online/qtsdkrepository/mac_x64/desktop/
      - name: "⚙️ Install Qt"
        uses: jurplel/install-qt-action@v4
        with:
          version: ${{env.QT_VERSION}}
          modules: ${{env.QT6_MODULES}}
          cache: true

      - name: "⚙️ Set Env"
        shell: bash
        run: |
          export VERSION=$(cat version.h | sed 's/[^0-9,.]//g')
          echo "VERSION=${VERSION}" >> $GITHUB_ENV

      - name: "⚙️ Printenv"
        shell: bash
        run: |
          echo "VERSION=${VERSION}"
          printenv

      - name: "🚧 Compile application"
        run: |
          echo "#define RELEASE \"GitHub Actions\"" > release.h
          lrelease QOwnNotes.pro
          #ls ${Qt5_Dir}/bin
          ${{env.QMAKE}} QOwnNotes.pro CONFIG+=release QMAKE_APPLE_DEVICE_ARCHS="x86_64 arm64"
          make -j ${{env.CORES}}
          ../build-systems/github/macos/create-dmg-qt6.sh

      - name: "📤 Release DMG"
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create_release.outputs.upload_url }}
          asset_path: src/QOwnNotes.dmg
          asset_name: QOwnNotes.dmg
          asset_content_type: application/x-apple-diskimage

  #
  # macOS Qt5 build
  #
  build-macos-qt5:
    name: "🍎 macOS Qt5"
    needs: create_release
    runs-on: macos-15
    env:
      QT_VERSION: 5.15.2
    steps:
      - name: "🧰 Checkout"
        uses: actions/checkout@v6
        with:
          submodules: recursive

      # https://download.qt.io/online/qtsdkrepository/mac_x64/desktop/
      - name: "⚙️ Install Qt"
        uses: jurplel/install-qt-action@v4
        with:
          version: ${{env.QT_VERSION}}
          modules: ${{env.QT_MODULES}}
          aqtversion: "==2.0.0"
          cache: true

      - name: "⚙️ Set Env"
        shell: bash
        run: |
          export VERSION=$(cat version.h | sed 's/[^0-9,.]//g')
          echo "VERSION=${VERSION}" >> $GITHUB_ENV

      - name: "⚙️ Printenv"
        shell: bash
        run: |
          echo "VERSION=${VERSION}"
          printenv

      # qmake workaround: https://bugreports.qt.io/browse/QTBUG-117225?focusedId=754625&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-754625
      # See https://github.com/pbek/QOwnNotes/issues/3018
      - name: "🚧 Compile application"
        run: |
          echo "#define RELEASE \"GitHub Actions\"" > release.h
          lrelease QOwnNotes.pro
          #ls ${Qt5_Dir}/bin
          ${{env.QMAKE}} -early QMAKE_DEFAULT_LIBDIRS=$(xcrun -show-sdk-path)/usr/lib
          make -j ${{env.CORES}}
          ../build-systems/github/macos/create-dmg.sh

      #      - name: '📤 Upload artifact: macOS'
      #        uses: actions/upload-artifact@v4
      #        with:
      #          name: QOwnNotes.dmg
      #          path: src/QOwnNotes.dmg

      - name: "📤 Release DMG"
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ needs.create_release.outputs.upload_url }}
          asset_path: src/QOwnNotes.dmg
          asset_name: QOwnNotesQt5.dmg
          asset_content_type: application/x-apple-diskimage
#  publish_release:
#    name: 📣 Publish release
#    runs-on: ubuntu-latest
#    needs: [create_release, build-appimage, build-windows, build-macos, build-macos-qt5, build-snap]
#    steps:
#      - name: 📣 Publish draft release
#        uses: eregon/publish-release@v1
#        env:
#          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
#        with:
#          release_id: ${{ needs.create_release.outputs.release_id }}
