#!/usr/bin/env bash
set -euo pipefail

# Relinkable FotoDrop HEIC decoder build. Run from this file's directory.
# Requires Docker and the two source archives distributed beside this script.
LIBHEIF_ARCHIVE='source/libheif-1.23.3.tar.gz'
# git commit 78c9746aea226b22885e8d35241353ce669c4ea5 (tag v1.23.3)
LIBHEIF_SHA256='8ab6d13e5ac3b3ac2bd44c1d874148b5aaaf830a535d413cb5e03b58b0799050'
LIBDE265_ARCHIVE='source/libde265-1.1.1.tar.gz'
# git commit 4dd701fffac01632ffd5cabc5ef10deb56accba1 (tag v1.1.1)
LIBDE265_SHA256='4c0706f13eeb69c1883da2081a76687ccb055a5d5a065c5bd5a04104ab3c51df'
EMSDK_IMAGE='emscripten/emsdk@sha256:f9479effb0d095fea1c8501b57c18d13876a5e3bfebcb71f0da68a0fe49c935f'

sha256sum --check <<EOF
${LIBHEIF_SHA256}  ${LIBHEIF_ARCHIVE}
${LIBDE265_SHA256}  ${LIBDE265_ARCHIVE}
EOF

BUILD_ROOT="$(pwd)/relink-build"
rm -rf "${BUILD_ROOT}"
mkdir -p "${BUILD_ROOT}/src" "${BUILD_ROOT}/out"
tar -xzf "${LIBHEIF_ARCHIVE}" -C "${BUILD_ROOT}/src"
tar -xzf "${LIBDE265_ARCHIVE}" -C "${BUILD_ROOT}/src"
cp main.cpp "${BUILD_ROOT}/main.cpp"

DOCKER_BUILD_ROOT="${BUILD_ROOT}"
if command -v cygpath >/dev/null 2>&1; then
	DOCKER_BUILD_ROOT="$(cygpath -w "${BUILD_ROOT}")"
	export MSYS_NO_PATHCONV=1
fi

docker run --rm \
	-v "${DOCKER_BUILD_ROOT}:/src" \
	-w /src \
	"${EMSDK_IMAGE}" \
	bash -euxo pipefail -c '
apt-get update
apt-get install -y --no-install-recommends pkg-config=0.29.2-1ubuntu3

mkdir -p src/libde265-1.1.1/build
cd src/libde265-1.1.1/build
emcmake cmake .. \
	-DBUILD_SHARED_LIBS=OFF \
	-DENABLE_SDL=OFF \
	-DENABLE_SIMD=OFF \
	-DENABLE_AVX2=OFF \
	-DENABLE_AVX512=OFF \
	-DENABLE_DECODER=ON \
	-DENABLE_ENCODER=OFF \
	-DENABLE_SHERLOCK265=OFF \
	-DENABLE_INTERNAL_DEVELOPMENT_TOOLS=OFF \
	-DWITH_FUZZERS=OFF \
	-DCMAKE_C_FLAGS=-O3 \
	-DCMAKE_CXX_FLAGS=-O3
emmake make -j"$(nproc)" de265
cp libde265/de265-version.h ../libde265/de265-version.h

mkdir -p /src/src/libheif-1.23.3/build
cd /src/src/libheif-1.23.3/build
emcmake cmake .. \
	-DBUILD_SHARED_LIBS=OFF \
	-DBUILD_TESTING=OFF \
	-DENABLE_PLUGIN_LOADING=OFF \
	-DENABLE_MULTITHREADING_SUPPORT=OFF \
	-DENABLE_PARALLEL_TILE_DECODING=OFF \
	-DWITH_LIBDE265=ON \
	-DLIBDE265_INCLUDE_DIR=/src/src/libde265-1.1.1 \
	-DLIBDE265_LIBRARY=/src/src/libde265-1.1.1/build/libde265/libde265.a \
	-DWITH_UNCOMPRESSED_CODEC=OFF \
	-DWITH_HEADER_COMPRESSION=OFF \
	-DWITH_X265=OFF \
	-DWITH_AOM_DECODER=OFF \
	-DWITH_AOM_ENCODER=OFF \
	-DWITH_DAV1D=OFF \
	-DWITH_SvtEnc=OFF \
	-DWITH_RAV1E=OFF \
	-DWITH_JPEG_DECODER=OFF \
	-DWITH_JPEG_ENCODER=OFF \
	-DWITH_OPENJPEG_DECODER=OFF \
	-DWITH_OPENJPEG_ENCODER=OFF \
	-DWITH_EXAMPLES=OFF \
	-DCMAKE_CXX_FLAGS=-O3
emmake make -j"$(nproc)" heif

emcc /src/main.cpp \
	-o /src/out/heic-decoder.js \
	-I/src/src/libheif-1.23.3/libheif/api \
	-I/src/src/libheif-1.23.3/build \
	/src/src/libheif-1.23.3/build/libheif/libheif.a \
	/src/src/libde265-1.1.1/build/libde265/libde265.a \
	-s WASM=1 \
	-s ALLOW_MEMORY_GROWTH=1 \
	-s MAXIMUM_MEMORY=268435456 \
	-s DYNAMIC_EXECUTION=0 \
	-s EXPORT_ES6=1 \
	-s MODULARIZE=1 \
	-s ENVIRONMENT=web,worker,node \
	-s EXPORT_NAME=createHeicDecoderModule \
	-O3 --bind
'

sha256sum "${BUILD_ROOT}/out/heic-decoder.js" "${BUILD_ROOT}/out/heic-decoder.wasm"
echo "Relinked artifacts are in ${BUILD_ROOT}/out"
