#!/bin/sh
set -eu

loader_dir='/usr/lib64/phpx-loader'
default_ini_dir='/etc/php.d'
php_bin="${PHPX_PHP_BIN:-php}"
ini_dir="${PHPX_PHP_INI_DIR:-$default_ini_dir}"
quiet=0

usage()
{
    echo "Usage: phpx-loader-select [--php-bin=PATH] [--ini-dir=DIR] [--quiet]" >&2
}

say()
{
    if [ "$quiet" -eq 0 ]; then
        echo "$*"
    fi
}

disable_loader()
{
    rm -f "$loader_dir/phpx_loader.so"
    rm -f "$ini_dir/40-phpx_loader.ini"
}

for argument in "$@"; do
    case "$argument" in
        --php-bin=*) php_bin=${argument#*=} ;;
        --ini-dir=*) ini_dir=${argument#*=} ;;
        --quiet) quiet=1 ;;
        --help|-h)
            usage
            exit 0
            ;;
        *)
            usage
            exit 2
            ;;
    esac
done

if ! command -v "$php_bin" >/dev/null 2>&1; then
    disable_loader
    say "PHPX Loader: PHP was not found; the extension was left disabled."
    exit 0
fi

if ! php_minor=$("$php_bin" -n -r \
    'printf("%d.%d", PHP_MAJOR_VERSION, PHP_MINOR_VERSION);'); then
    disable_loader
    echo "PHPX Loader: could not determine the PHP version from $php_bin." >&2
    exit 1
fi
php_suffix=$(printf '%s' "$php_minor" | tr -d '.')
selected_loader="$loader_dir/phpx_loader-php${php_suffix}.so"

if [ ! -f "$selected_loader" ]; then
    disable_loader
    echo "PHPX Loader: this package has no loader for PHP $php_minor." >&2
    echo "Available loaders:" >&2
    for loader in "$loader_dir"/phpx_loader-php*.so; do
        [ -f "$loader" ] || continue
        basename "$loader" | sed -e 's/^phpx_loader-php/  PHP /' -e 's/\.so$//' >&2
    done
    exit 1
fi

if ! "$php_bin" -n -d "extension=$selected_loader" \
    -r 'exit(extension_loaded("phpx_loader") ? 0 : 1);'; then
    disable_loader
    echo "PHPX Loader: $selected_loader is not compatible with $php_bin." >&2
    exit 1
fi

mkdir -p "$loader_dir" "$ini_dir"
ln -sfn "$(basename "$selected_loader")" "$loader_dir/phpx_loader.so"

temporary_ini=$(mktemp "$ini_dir/.40-phpx_loader.ini.XXXXXX")
trap 'rm -f "$temporary_ini"' EXIT HUP INT TERM
printf '; Selected by phpx-loader-select for PHP %s\nextension=%s/phpx_loader.so\n' \
    "$php_minor" "$loader_dir" > "$temporary_ini"
chmod 0644 "$temporary_ini"
mv -f "$temporary_ini" "$ini_dir/40-phpx_loader.ini"
trap - EXIT HUP INT TERM

say "PHPX Loader: enabled $selected_loader for PHP $php_minor."
