#!/usr/bin/env bash

# fail hard
set -o pipefail
# fail harder
set -eu

source $(dirname $BASH_SOURCE)/../../_util/include/manifest.sh

OUT_PREFIX=$1

export PATH=${OUT_PREFIX}/bin:${PATH}

dep_formula=${0#$WORKSPACE_DIR/}
dep_name=$(basename $BASH_SOURCE)
dep_version=${dep_formula##*"/${dep_name}-"}
dep_package=ext-${dep_name}-${dep_version}
dep_dirname=${dep_name}-${dep_version}
dep_archive_name=${dep_dirname}.tgz
dep_url=https://pecl.php.net/get/${dep_archive_name}
series=$(php-config --version | cut -d. -f1,2) # get "7.3", "7.4", "8.0" etc for the php requirement in the manifest
dep_manifest=${dep_package}_php-$series.composer.json

echo "-----> Building ${dep_package} (from PECL)..."

curl -L ${dep_url} | tar xz

pushd ${dep_dirname}
phpize
./configure \
	--prefix=${OUT_PREFIX} \
	${CONFIGURE_EXTRA:-}
make -s -j $(($(nproc)+1))

# php was a build dep, and it's in $OUT_PREFIX; we only want our build results in the final archive, and no build deps
# the easiest way is to nuke $OUT_PREFIX and running "make install", but extensions built for PHP 8.1+ need PHP headers during linking
# so instead we use the extension Makefile's INSTALL_ROOT variable to prefix the install destination path name, and then move that back to $OUT_PREFIX
tmpdest=$(mktemp -d)

if [[ $series == 7.* ]]; then
	# we need to install apcu first to build this
	make install -s
	popd

	dep2_name=apcu_bc
	dep2_version=1.0.5
	dep2_dirname=${dep2_name}-${dep2_version}
	dep2_archive_name=${dep2_dirname}.tgz
	dep2_url=https://pecl.php.net/get/${dep2_archive_name}

	echo "-----> Building ${dep2_name}-${dep2_version} (from PECL)..."

	curl -L ${dep2_url} | tar xz

	pushd ${dep2_dirname}
	phpize
	./configure \
		--prefix=${OUT_PREFIX}
	make -s -j $(($(nproc)+1))
	echo "-----> Installing into clean ${tmpdest}..."
	make INSTALL_ROOT=$tmpdest install -s
	popd

	MANIFEST_REPLACE="${MANIFEST_REPLACE:-"{\"heroku-sys/ext-apc\":\"self.version\"}"}" # despite version 1.0.3 or whatever, apcu_bc identifies itself using the apcu version number
	
	pushd ${dep_dirname}
fi

# install apcu ext
echo "-----> Installing into clean ${tmpdest}..."
make INSTALL_ROOT=$tmpdest install -s
echo "-----> Moving install result from ${tmpdest}${OUT_PREFIX} to $OUT_PREFIX..."
rm -rf $OUT_PREFIX # remove $OUT_PREFIX first (otherwise we'd move things *into* it)
mv ${tmpdest}${OUT_PREFIX} $OUT_PREFIX # move from /tmp/foobarz/app/.heroku/php to /app/.heroku/php
popd

mkdir -p ${OUT_PREFIX}/etc/php/conf.d
cat > ${OUT_PREFIX}/etc/php/conf.d/apcu.ini-dist <<'EOF'
extension=apcu.so
EOF
if [[ $series == 7.* ]]; then
	cat >> ${OUT_PREFIX}/etc/php/conf.d/apcu.ini-dist <<-'EOF'
		extension=apc.so
	EOF
fi

# cleanup
strip --strip-unneeded ${OUT_PREFIX}/lib/php/extensions/*/*.so

MANIFEST_REQUIRE="${MANIFEST_REQUIRE:-"{\"heroku-sys/php\":\"${series}.*\"}"}"
MANIFEST_CONFLICT="${MANIFEST_CONFLICT:-"{}"}"
MANIFEST_REPLACE="${MANIFEST_REPLACE:-"{}"}"
MANIFEST_PROVIDE="${MANIFEST_PROVIDE:-"{}"}"
MANIFEST_EXTRA="${MANIFEST_EXTRA:-"{\"config\":\"etc/php/conf.d/apcu.ini-dist\"}"}"

python $(dirname $BASH_SOURCE)/../../_util/include/manifest.py "heroku-sys-php-extension" "heroku-sys/ext-${dep_name}" "$dep_version" "${dep_formula}.tar.gz" "$MANIFEST_REQUIRE" "$MANIFEST_CONFLICT" "$MANIFEST_REPLACE" "$MANIFEST_PROVIDE" "$MANIFEST_EXTRA" > $dep_manifest

print_or_export_manifest_cmd "$(generate_manifest_cmd "$dep_manifest")"
