#!/bin/bash
# Run the public eastbook-rebuild-1 recipe. Does not repack sources and does not delete an existing work directory.
set -euo pipefail

LIBHEIF=""
LIBHEIF_SHA=""
LIBDE265=""
LIBDE265_SHA=""
WRAPPER=""
WRAPPER_SHA=""
EXPECT_LIB=""
EXPECT_CSP=""
WORK=""
EMSDK_DIR=""
CMAKE_BIN=""
ESBUILD_DIR=""
RECEIPT_DIR=""
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"

while [ $# -gt 0 ]; do
  case "$1" in
    --libheif) LIBHEIF="$2"; shift 2 ;;
    --libheif-sha256) LIBHEIF_SHA="$2"; shift 2 ;;
    --libde265) LIBDE265="$2"; shift 2 ;;
    --libde265-sha256) LIBDE265_SHA="$2"; shift 2 ;;
    --wrapper) WRAPPER="$2"; shift 2 ;;
    --wrapper-sha256) WRAPPER_SHA="$2"; shift 2 ;;
    --expect-lib-sha256) EXPECT_LIB="$2"; shift 2 ;;
    --expect-csp-sha256) EXPECT_CSP="$2"; shift 2 ;;
    --work) WORK="$2"; shift 2 ;;
    --emsdk) EMSDK_DIR="$2"; shift 2 ;;
    --cmake) CMAKE_BIN="$2"; shift 2 ;;
    --esbuild) ESBUILD_DIR="$2"; shift 2 ;;
    --receipt-dir) RECEIPT_DIR="$2"; shift 2 ;;
    *) echo "unknown argument: $1" >&2; exit 2 ;;
  esac
done

if [ -z "$LIBHEIF" ] || [ -z "$LIBHEIF_SHA" ] || [ -z "$LIBDE265" ] || [ -z "$LIBDE265_SHA" ] || [ -z "$WRAPPER" ] || [ -z "$WRAPPER_SHA" ] || [ -z "$EXPECT_LIB" ] || [ -z "$EXPECT_CSP" ] || [ -z "$WORK" ] || [ -z "$EMSDK_DIR" ] || [ -z "$CMAKE_BIN" ] || [ -z "$ESBUILD_DIR" ] || [ -z "$RECEIPT_DIR" ]; then
  echo "missing required argument" >&2
  exit 2
fi
if [ -e "$WORK" ]; then
  echo "work directory already exists: $WORK" >&2
  exit 2
fi
if [ ! -d "$RECEIPT_DIR" ]; then
  echo "receipt dir missing" >&2
  exit 2
fi

mkdir "$WORK"
"$SCRIPT_DIR/rebuild-one.sh" \
  --libheif "$LIBHEIF" --libheif-sha256 "$LIBHEIF_SHA" \
  --libde265 "$LIBDE265" --libde265-sha256 "$LIBDE265_SHA" \
  --work "$WORK/codec" \
  --emsdk "$EMSDK_DIR" \
  --cmake "$CMAKE_BIN" \
  --receipt "$RECEIPT_DIR/codec.log"

lib_js="$WORK/codec/libheif-1.23.5/buildjs/libheif.js"
got_lib="$(shasum -a 256 "$lib_js" | awk '{print $1}')"
if [ "$got_lib" != "$EXPECT_LIB" ]; then
  echo "libheif.js hash mismatch $got_lib" >&2
  exit 3
fi

node "$SCRIPT_DIR/bundle-csp.mjs" \
  --lib "$lib_js" --lib-sha256 "$EXPECT_LIB" \
  --wrapper "$WRAPPER" --wrapper-sha256 "$WRAPPER_SHA" \
  --esbuild "$ESBUILD_DIR" \
  --work "$WORK/bundle" \
  --out "$WORK/heic-to-csp.js"

got_csp="$(shasum -a 256 "$WORK/heic-to-csp.js" | awk '{print $1}')"
if [ "$got_csp" != "$EXPECT_CSP" ]; then
  echo "csp hash mismatch $got_csp" >&2
  exit 3
fi
echo "LIB_SHA:$got_lib"
echo "CSP_SHA:$got_csp"
exit 0
