#!/usr/bin/env bash
set -eo pipefail

echo "---> PHP Buildpack"

# 1. GET ARGS
layers_dir=$1
plan_path=$3

# shellcheck source=/dev/null
. generate-project.sh "${layers_dir}"

php_layer_dir="${layers_dir}"/php
extensions_layer_dir="${layers_dir}"/extensions
mkdir -p "${extensions_layer_dir}"/{docs,ext}

bp_dir=$(
  cd "$(dirname "$0")"/..
  pwd
)

# 2. Install build deps
# shellcheck source=/dev/null
. generate-layers.sh "${layers_dir}"
generate_deps_layer build-deps
generate_deps_layer run-deps

# 3. install php and nginx
generate_stack_layer php "${plan_path}" true
generate_stack_layer nginx "${plan_path}" true

# 4. pre php env and tools
php_version=$(yj <"${plan_path}" -t | jq -r ".entries[] | select(.name == \"php\") | .metadata.version")
export php_version="${php_version}"
export php_layer_dir="${php_layer_dir}"
mkdir -p "${php_layer_dir}"/config/
cp -rf "${php_layer_dir}/sbin/php-fpm" "${php_layer_dir}/bin"
cp -rf "${bp_dir}/config/php/"* "${php_layer_dir}"/config/
cp -rf "${bp_dir}"/lib/* "${php_layer_dir}"/bin/
mv -f "${php_layer_dir}"/bin/Builder.php "${php_layer_dir}"/lib/php/PEAR/Builder.php
# shellcheck source=/dev/null
. init-stack

# Compares previous extensions.json checksum to the current extensions.json
pecl config-set ext_dir "${extensions_layer_dir}"/ext
pecl config-set doc_dir "${extensions_layer_dir}"/docs

local_extensions_checksum="$(sha256sum extensions.json | cut -d ' ' -f 1 || echo 'not found')"
remote_extensions_checksum="not found"
if [[ -f "${extensions_layer_dir}.toml" ]]; then
  remote_extensions_checksum=$(yj <"${extensions_layer_dir}.toml" -t | jq -r .metadata.version 2>/dev/null || echo 'not found')
fi
if [[ -f extensions.json && "${local_extensions_checksum}" == "${remote_extensions_checksum}" ]]; then
  echo "---> Reusing extensions.json"
elif [[ -f extensions.json ]]; then
  echo "---> Installing extensions.json"
  rm "${php_layer_dir}"/ext/* -rf
  cp -f "${bp_dir}/config/php/php.ini" "${php_layer_dir}/config/"
  "${bp_dir}"/bin/install-extensions
fi
cat >"${extensions_layer_dir}.toml" <<EOL
[types]
cache = true
build = true
launch = true

[metadata]
version = "${local_extensions_checksum}"
EOL

# Compares previous composer.json checksum to the current composer.json
composer_layer_dir="${layers_dir}"/composer
mkdir -p "${composer_layer_dir}"/{vendor,profile.d}
local_composer_checksum=$(sha256sum composer.json | cut -d ' ' -f 1 || echo 'not found')
remote_composer_checksum="not found"
if [[ -f "${composer_layer_dir}.toml" ]]; then
  remote_composer_checksum=$(yj <"${composer_layer_dir}.toml" -t | jq -r .metadata.version 2>/dev/null || echo 'not found')
fi
cat >"${composer_layer_dir}/profile.d/composer.sh" <<EOL
export COMPOSER_HOME=${composer_layer_dir}
export COMPOSER_VENDOR_DIR=${composer_layer_dir}/vendor
echo "include_path=.:${composer_layer_dir}" >> "${php_layer_dir}/config/php.ini"
EOL
# shellcheck source=/dev/null
. init-stack

composer config --no-plugins bin-dir
composer config --no-plugins vendor-dir
if [[ -f composer.json && "${local_composer_checksum}" == "${remote_composer_checksum}" ]]; then
  echo "---> Reusing composer.json"
else
  echo "---> Installing composer.json"
  composer install
  cat >"${composer_layer_dir}.toml" <<EOL
[types]
cache = true
build = true
launch = true

[metadata]
version = "${local_composer_checksum}"
EOL
fi

echo "---> Config nginx"
nginx_layer_dir="${layers_dir}/nginx"
mkdir -p "${layers_dir}/nginx/"logs
cp -r /opt/drycc/nginx/conf/* "${nginx_layer_dir}"
cp "${bp_dir}/config/nginx/base.conf" "${nginx_layer_dir}/nginx-php.conf.tpl"
cat >"${nginx_layer_dir}.toml" <<EOL
[types]
cache = true
build = true
launch = true
EOL

cat >"${php_layer_dir}/bin/php-nginx-fpm" <<SH
#!/usr/bin/env bash
mkdir -p "${layers_dir}/log" /tmp/nginx/logs/
touch "${layers_dir}/log/php-fpm.log"
cat "${nginx_layer_dir}/nginx-php.conf.tpl" > "${nginx_layer_dir}/nginx-php.conf"
sed -i "s|@ROOT@|\$(readlink -f \$1)|g" "${nginx_layer_dir}/nginx-php.conf"
sed -i "s|@PORT@|\$2|g" "${nginx_layer_dir}/nginx-php.conf"
php-fpm -c "${php_layer_dir}/config/php.ini" -y "${php_layer_dir}/config/php-fpm.conf" -p "${php_layer_dir}"
nginx -p "${nginx_layer_dir}" -c "${nginx_layer_dir}/nginx-php.conf"
SH

chmod +x "${php_layer_dir}/bin/php-nginx-fpm"

generate-launch.sh "${layers_dir}"
