#!/bin/bash
set -e

# version check: https://github.com/strukturag/libheif/releases
LIBHEIF_VERSION="1.23.4"
PACKAGE_VERSION="$LIBHEIF_VERSION-1discourse1"
LIBHEIF_HASH="d0c02b4b0e978f34a1974b6f3eea7975a537bf7a9195ffeea38e7242ff316fdd"

PREFIX=/usr
WDIR=/tmp/libheif
PACKAGE_DIR=/tmp/libheif-packages

export DEBIAN_FRONTEND=noninteractive
apt -y -q install ninja-build pkg-config dpkg-dev libde265-dev libx265-dev libaom-dev

MULTIARCH=$(dpkg-architecture -qDEB_HOST_MULTIARCH)
ARCHITECTURE=$(dpkg --print-architecture)
test -n "$MULTIARCH"
test -n "$ARCHITECTURE"

mkdir -p "$WDIR" "$PACKAGE_DIR"
cd "$WDIR"

wget -q -O "$WDIR/libheif.tar.gz" "https://github.com/strukturag/libheif/releases/download/v$LIBHEIF_VERSION/libheif-$LIBHEIF_VERSION.tar.gz"
echo "$LIBHEIF_HASH $WDIR/libheif.tar.gz" | sha256sum -c
tar xzf "$WDIR/libheif.tar.gz" -C "$WDIR"
cd "$WDIR/libheif-$LIBHEIF_VERSION"

cmake -S . -B build -G Ninja \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_INSTALL_PREFIX=$PREFIX \
  "-DCMAKE_INSTALL_LIBDIR=lib/$MULTIARCH" \
  -DBUILD_SHARED_LIBS=ON \
  -DBUILD_TESTING=OFF \
  -DBUILD_DOCUMENTATION=OFF \
  -DENABLE_PLUGIN_LOADING=OFF \
  -DWITH_EXAMPLES=OFF \
  -DWITH_GDK_PIXBUF=OFF \
  -DWITH_LIBDE265=ON \
  -DWITH_X265=ON \
  -DWITH_AOM_DECODER=ON \
  -DWITH_AOM_ENCODER=ON \
  -DWITH_X264=OFF \
  -DWITH_OpenH264_DECODER=OFF

cmake --build build -j"$(nproc)"
DESTDIR="$WDIR/install" cmake --install build

RUNTIME_ROOT="$WDIR/package-libheif1"
DEV_ROOT="$WDIR/package-libheif-dev"
GUARD_ROOT="$WDIR/package-discourse-libheif-guard"
LIBDIR="usr/lib/$MULTIARCH"
mkdir -p "$RUNTIME_ROOT/$LIBDIR" "$DEV_ROOT" "$GUARD_ROOT/DEBIAN"
cp -a "$WDIR/install/." "$DEV_ROOT"
mv "$DEV_ROOT/$LIBDIR"/libheif.so.1* "$RUNTIME_ROOT/$LIBDIR/"

mkdir -p debian
cat > debian/control <<EOF
Source: libheif
Section: libs
Priority: optional
Maintainer: Discourse Team <team@discourse.org>

Package: libheif1
Architecture: any
Description: HEIF and AVIF codec library built for Discourse
EOF
RUNTIME_DEPENDS=$(dpkg-shlibdeps -O "$RUNTIME_ROOT/$LIBDIR/libheif.so.$LIBHEIF_VERSION" | sed -n 's/^shlibs:Depends=//p')
test -n "$RUNTIME_DEPENDS"

mkdir -p "$RUNTIME_ROOT/DEBIAN" "$DEV_ROOT/DEBIAN"
cat > "$RUNTIME_ROOT/DEBIAN/control" <<EOF
Package: libheif1
Version: $PACKAGE_VERSION
Architecture: $ARCHITECTURE
Maintainer: Discourse Team <team@discourse.org>
Section: libs
Priority: optional
Depends: $RUNTIME_DEPENDS
Description: HEIF and AVIF codec library built for Discourse
 Pinned libheif build used by Discourse's ImageMagick and libvips.
EOF
cat > "$DEV_ROOT/DEBIAN/control" <<EOF
Package: libheif-dev
Version: $PACKAGE_VERSION
Architecture: $ARCHITECTURE
Maintainer: Discourse Team <team@discourse.org>
Section: libdevel
Priority: optional
Depends: libheif1 (= $PACKAGE_VERSION)
Description: HEIF and AVIF codec development files built for Discourse
 Development headers and metadata for the pinned Discourse libheif build.
EOF
cat > "$GUARD_ROOT/DEBIAN/control" <<EOF
Package: discourse-libheif-guard
Version: $PACKAGE_VERSION
Architecture: all
Maintainer: Discourse Team <team@discourse.org>
Section: libs
Priority: optional
Depends: libheif1 (= $PACKAGE_VERSION)
Conflicts: libheif1 (<< $PACKAGE_VERSION)
Description: Prevent replacement of Discourse's pinned libheif build
 This guard makes direct installation of an older libheif1 package fail.
EOF

dpkg-deb --build --root-owner-group "$RUNTIME_ROOT" "$PACKAGE_DIR/libheif1.deb"
dpkg-deb --build --root-owner-group "$DEV_ROOT" "$PACKAGE_DIR/libheif-dev.deb"
dpkg-deb --build --root-owner-group "$GUARD_ROOT" "$PACKAGE_DIR/discourse-libheif-guard.deb"
dpkg -i "$PACKAGE_DIR/libheif1.deb" "$PACKAGE_DIR/libheif-dev.deb" "$PACKAGE_DIR/discourse-libheif-guard.deb"
ldconfig

# Keep HEVC and AV1 support built into the library so no libheif plugins need
# to be installed in the runtime image.
test "$(pkg-config --modversion libheif)" = "$LIBHEIF_VERSION"
ldd "$PREFIX/lib/$MULTIARCH/libheif.so.1" | grep -q 'libde265\.so'
ldd "$PREFIX/lib/$MULTIARCH/libheif.so.1" | grep -q 'libx265\.so'
ldd "$PREFIX/lib/$MULTIARCH/libheif.so.1" | grep -q 'libaom\.so'

dpkg-query -W -f='${Version}\n' libheif1 | grep -qx "$PACKAGE_VERSION"
dpkg-query -S "$PREFIX/lib/$MULTIARCH/libheif.so.$LIBHEIF_VERSION" | grep -q '^libheif1:'

cd "$HOME"
rm -rf "$WDIR"
