# Maintainer: rzy <me@23ro.org>
pkgbase=okular-mupdf-ng
pkgname=(okular-mupdf-ng okular-mupdf-ng-dynamic)
_pkgname=okular-mupdf-ng
# Keep the MuPDF version and checksum in sync with cmake/mupdf.version.
_mupdfver=1.28.5
pkgver=0.5.0
pkgrel=1
pkgdesc="A MuPDF-based secure and fast backend for Okular"
arch=('x86_64')
url="https://github.com/l4rzy/okular-mupdf-ng"
license=('GPL-3.0-or-later')
# nss is required at configure time via pkg_check_modules(NSS REQUIRED); mupdf
# provides the headers and pkg-config file for the dynamic variant; mold links
# the two large static archives much faster than lld and is a hard requirement
# so packaging stays deterministic.
makedepends=('brotli' 'cmake' 'extra-cmake-modules' 'freetype2'
             'gcc' 'git' 'jq'
             'libjpeg-turbo' 'mold' 'mupdf' 'nss' 'pkgconf'
             'patch' 'qt6-tools')
# The static package still links system FreeType, JPEG, Brotli, and zlib;
# JBIG2, OpenJPEG, and the other bundled libraries add no runtime dependencies.
# Global depends serves the pre-build dependency check; each package function
# overrides depends for its own link variant.
_common_depends=('okular' 'qt6-base' 'nss' 'libseccomp')
depends=("${_common_depends[@]}"
         'brotli' 'freetype2'
         'libjpeg-turbo' 'zlib')
conflicts=(okular-mupdf-ng-dynamic okular-mupdf-ng-git)
# Replace the local Git URL with git+$url.git when the PKGBUILD is standalone.
source=("$_pkgname::git+file://$startdir/.."
        "https://github.com/ArtifexSoftware/mupdf-downloads/releases/download/$_mupdfver/mupdf-$_mupdfver-source.tar.gz")
sha256sums=('SKIP'
            '98a5c10cda20c3992cdf76ff6b2a1149c32bd79cc796d3f703230b1185b7e934')
_PREFIX="${PREFIX:-/usr}"

pkgver() {
  local json_file="$srcdir/$_pkgname/src/generator/manifest.json"
  local base_ver
  if [ -f "$json_file" ]; then
    base_ver=$(jq -r '.KPlugin.Version' "$json_file" 2>/dev/null)
  fi
  printf "%s" "$base_ver"
}

build() {
  # Single build directory flipped between link variants: only
  # MuPDF-dependent targets (worker core, generator adapters, tests) recompile
  # when USE_SYSTEM_MUPDF changes, while MuPDF-agnostic objects are reused.
  # Each variant is staged before the flip overwrites it. The dynamic variant
  # targets the system MuPDF package pinned by the dynamic variant dependency.
  local _builddir="$srcdir/build-unified"
  rm -rf "$srcdir/stage-static" "$srcdir/stage-dynamic"
  cmake -B "$_builddir" -S "$srcdir/$_pkgname" -G Ninja \
    -DCMAKE_BUILD_TYPE=None \
    -DCMAKE_INSTALL_PREFIX="${_PREFIX}" \
    -DKDE_INSTALL_USE_QT_SYS_PATHS=ON \
    -DCMAKE_LINKER_TYPE=MOLD \
    -DUSE_SYSTEM_MUPDF=OFF \
    -DMUPDF_SOURCE_DIR="$srcdir/mupdf-$_mupdfver-source" \
    -DBUILD_TESTING=ON
  cmake --build "$_builddir"
  ctest --test-dir "$_builddir" --output-on-failure
  DESTDIR="$srcdir/stage-static" cmake --install "$_builddir"
  cmake -B "$_builddir" -S "$srcdir/$_pkgname" -G Ninja \
    -DCMAKE_BUILD_TYPE=None \
    -DCMAKE_INSTALL_PREFIX="${_PREFIX}" \
    -DKDE_INSTALL_USE_QT_SYS_PATHS=ON \
    -DCMAKE_LINKER_TYPE=MOLD \
    -DUSE_SYSTEM_MUPDF=ON \
    -DBUILD_TESTING=ON
  cmake --build "$_builddir"
  ctest --test-dir "$_builddir" --output-on-failure
  DESTDIR="$srcdir/stage-dynamic" cmake --install "$_builddir"
}

check() {
  # Tests already run per variant in build() before each staged install (the
  # second build overwrites the first variant's binaries); just verify both
  # stages were produced.
  test -f "$srcdir/stage-static/${_PREFIX#/}/lib/okular-mupdf-ng/mupdfng-worker" \
    && test -f "$srcdir/stage-dynamic/${_PREFIX#/}/lib/okular-mupdf-ng/mupdfng-worker"
  test -f "$srcdir/stage-static/${_PREFIX#/}/share/okular-mupdf-ng/Allura-Regular.ttf" \
    && test -f "$srcdir/stage-static/${_PREFIX#/}/share/doc/okular-mupdf-ng/Allura-OFL.txt" \
    && test -f "$srcdir/stage-static/${_PREFIX#/}/share/doc/okular-mupdf-ng/MuPDF-COPYING"
  test -f "$srcdir/stage-dynamic/${_PREFIX#/}/share/okular-mupdf-ng/Allura-Regular.ttf" \
    && test -f "$srcdir/stage-dynamic/${_PREFIX#/}/share/doc/okular-mupdf-ng/Allura-OFL.txt" \
    && test -f "$srcdir/stage-dynamic/${_PREFIX#/}/share/doc/okular-mupdf-ng/MuPDF-COPYING"
}

package_okular-mupdf-ng() {
  pkgdesc="A MuPDF-based secure and fast backend for Okular (statically linked MuPDF)"
  conflicts=(okular-mupdf-ng-dynamic okular-mupdf-ng-git)
  cp -a "$srcdir/stage-static/." "$pkgdir"/
}

package_okular-mupdf-ng-dynamic() {
  pkgdesc="A MuPDF-based secure and fast backend for Okular (system MuPDF)"
  # The system MuPDF pulls its third-party libraries in transitively.
  local mupdf_version
  mupdf_version=$(pkg-config --modversion mupdf)
  depends=("${_common_depends[@]}" "libmupdf=${mupdf_version}")
  provides=(okular-mupdf-ng)
  conflicts=(okular-mupdf-ng okular-mupdf-ng-git)
  cp -a "$srcdir/stage-dynamic/." "$pkgdir"/
}
