#!/bin/sh
set -e

extDir="$(php -r 'echo ini_get("extension_dir");')"
cd "${extDir}"

usage() {
	echo "usage: $0 [options] module-name [module-name ...]"
	echo "   ie: $0 gd mysqli"
	echo "       $0 pdo pdo_mysql"
	echo "       $0 --ini-name 0-apc.ini apcu apc"
	echo
	echo 'Possible values for module-name:'
    printf '%s\n' *.so | sed 's/\.so$//' | xargs
	echo
	echo 'Some of the above modules are already compiled into PHP; please check'
	echo 'the output of "php -i" to see which modules are already loaded.'
}

if ! opts="$(getopt -o 'h?' --long 'help,ini-name:' -- "$@")"; then
    usage >&2
    false
fi
eval set -- "${opts}"

iniName=
while true; do
	flag="$1"
	shift
	case "${flag}" in
		--help|-h|'-?') usage; exit;;
		--ini-name) iniName="$1" && shift ;;
		--) break ;;
		*)
			{
				echo "error: unknown flag: ${flag}"
				usage
			} >&2
			exit 1
			;;
	esac
done

modules=
for module; do
	if [ -z "${module}" ]; then
		continue
	fi
	if [ -f "${module}.so" ] && ! [ -f "${module}" ]; then
		# allow ".so" to be optional
		module="${module}.so"
	fi
	if ! [ -f "${module}" ]; then
		echo >&2 "error: '${module}' does not exist"
		echo >&2
		usage >&2
		exit 1
	fi
	modules="${modules} ${module}"
done

if [ -z "${modules}" ]; then
	usage >&2
	exit 1
fi

pm='unknown'
if [ -e /lib/apk/db/installed ]; then
	pm='apk'
fi

apkDel=
if [ "${pm}" = 'apk' ]; then
	if \
		[ -n "${PHPIZE_DEPS}" ] \
		&& ! apk info --installed .phpize-deps > /dev/null \
		&& ! apk info --installed .phpize-deps-configure > /dev/null \
	; then
		apk add --no-cache --virtual '.docker-php-ext-enable-deps' binutils
		apkDel='.docker-php-ext-enable-deps'
	fi
fi

for module in ${modules}; do
	if readelf --wide --syms "${module}" | grep -q ' zend_extension_entry$'; then
		# https://wiki.php.net/internals/extensions#loading_zend_extensions
		absModule="$(readlink -f "${module}")"
		line="zend_extension=${absModule}"
	else
		line="extension=${module}"
	fi

	ext="$(basename "${module}")"
	ext="${ext%.*}"
	if php -r 'exit(extension_loaded("'"${ext}"'") ? 0 : 1);'; then
		# this isn't perfect, but it's better than nothing
		# (for example, 'opcache.so' presents inside PHP as 'Zend OPcache', not 'opcache')
		echo >&2
		echo >&2 "warning: ${ext} (${module}) is already loaded!"
		echo >&2
		continue
	fi

	ini="/usr/local/etc/php/conf.d/${iniName:-"docker-php-ext-${ext}.ini"}"
	if ! grep -q "${line}" "${ini}" 2>/dev/null; then
		echo "${line}" >> "${ini}"
	fi
done

if [ "${pm}" = 'apk' ] && [ -n "${apkDel}" ]; then
	apk del "${apkDel}"
fi
