#!/usr/bin/env bash

set -euo pipefail

install_directory="${1:-${HOME}/tools}"
composer_file="${install_directory}/composer.phar"

fail() {
    echo "$1" >&2
    exit 1
}

command -v php >/dev/null 2>&1 || fail "Missing required command: php"

if [[ -f "${composer_file}" ]]; then
    php "${composer_file}" --version
    echo "Composer already exists at ${composer_file}."
    exit 0
fi

temporary_directory="$(mktemp -d)"
cleanup() {
    rm -rf "${temporary_directory}"
}
trap cleanup EXIT

expected_signature="$(php -r "copy('https://composer.github.io/installer.sig', 'php://stdout');")"
[[ -n "${expected_signature}" ]] || fail "Could not download the Composer installer signature."

php -r "copy('https://getcomposer.org/installer', '${temporary_directory}/composer-setup.php');"
[[ -f "${temporary_directory}/composer-setup.php" ]] || fail "Could not download the Composer installer."

actual_signature="$(php -r "echo hash_file('sha384', '${temporary_directory}/composer-setup.php');")"
if [[ "${actual_signature}" != "${expected_signature}" ]]; then
    fail "Composer installer signature verification failed."
fi

mkdir -p "${install_directory}"
php "${temporary_directory}/composer-setup.php" \
    --2 \
    --install-dir="${install_directory}" \
    --filename="composer.phar"
chmod 700 "${composer_file}"
php "${composer_file}" --version

echo "Composer installed at ${composer_file}."
