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

readonly JSQUASH_COMMIT="3c0672654a01dbc8c8fcd80c191702732736f93d"
readonly LIBHEIF_VERSION="1.19.7"
readonly LIBHEIF_SHA256="8334c7c418f82c30c9bec1f46e6abfd5a8d3c420a3210d5505eb1868696ce0cc"
readonly LIBDE265_VERSION="1.0.15"
readonly LIBDE265_SHA256="d4e55706dfc5b2c5c9702940b675ce2d3e7511025c6894eaddcdbaf0b15fd3f3"

work_dir="${1:-$PWD/.heic-codec-relink}"
install_dir="${HEIC_CODEC_INSTALL_DIR:-$PWD/node_modules/@discourse/heic}"
checkout="$work_dir/discourse-jsquash"
codec="$checkout/packages/heic/codec"

mkdir -p "$work_dir"
if [[ ! -d "$checkout/.git" ]]; then
  git clone https://github.com/discourse/jSquash.git "$checkout"
fi
git -C "$checkout" fetch origin "$JSQUASH_COMMIT"
git -C "$checkout" checkout --detach "$JSQUASH_COMMIT"

mkdir -p "$work_dir/downloads" "$codec/node_modules"
heif_archive="$work_dir/downloads/libheif-v$LIBHEIF_VERSION.tar.gz"
de265_archive="$work_dir/downloads/libde265-v$LIBDE265_VERSION.tar.gz"
curl -fL "https://github.com/strukturag/libheif/archive/refs/tags/v$LIBHEIF_VERSION.tar.gz" -o "$heif_archive"
curl -fL "https://github.com/strukturag/libde265/archive/refs/tags/v$LIBDE265_VERSION.tar.gz" -o "$de265_archive"
echo "$LIBHEIF_SHA256  $heif_archive" | sha256sum --check
echo "$LIBDE265_SHA256  $de265_archive" | sha256sum --check

if [[ "${HEIC_CODEC_USE_EXISTING_SOURCES:-0}" != "1" ]]; then
  mkdir -p "$codec/node_modules/libheif" "$codec/node_modules/libde265"
  tar xzf "$heif_archive" --strip-components=1 -C "$codec/node_modules/libheif"
  tar xzf "$de265_archive" --strip-components=1 -C "$codec/node_modules/libde265"
fi

(
  cd "$codec"
  make clean
  EMSDK_VERSION=3.1.57 DEFAULT_CFLAGS='-Oz -flto' ../../../tools/build-cpp.sh
)

mkdir -p "$install_dir/codec/dec"
cp "$codec/dec/heic_dec.js" "$install_dir/codec/dec/heic_dec.js"
cp "$codec/dec/heic_dec.wasm" "$install_dir/codec/dec/heic_dec.wasm"
printf 'Relinked codec installed in %s\nRun `bun run build` to emit it.\n' "$install_dir"
