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

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/lib/common.sh"

PROJECT_ENV=""
ARTIFACT_ROOT=""
APPROVAL_FILE=""
APPLY=0
while [ "$#" -gt 0 ]; do
  case "$1" in
    --project-env) PROJECT_ENV="$2"; shift 2 ;;
    --artifact-root) ARTIFACT_ROOT="$2"; shift 2 ;;
    --approval-file) APPROVAL_FILE="$2"; shift 2 ;;
    --apply) APPLY=1; shift ;;
    *) die "unknown argument: $1" ;;
  esac
done

[ -n "$PROJECT_ENV" ] || die "--project-env is required"
[ -n "$ARTIFACT_ROOT" ] || die "--artifact-root is required"
load_env_file "$PROJECT_ENV"
assert_no_placeholders "$PROJECT_ENV"

REDIS_SRC="$ARTIFACT_ROOT/runtime/redis-5.3.5.tgz"
MQTT_SRC="$ARTIFACT_ROOT/runtime/Mosquitto-0.4.0.tgz"
verify_sha256 "$REDIS_SRC" "d55fa5cc699198917ba2bdc827da632ad77f009ba2642d2750456a976dbe5989"
verify_sha256 "$MQTT_SRC" "eec599110f733afe5e0331a85d8feb354ec079b088bdca2dd81a587c5b50f8e4"

log "PLAN build Redis 5.3.5 and Mosquitto 0.4.0 extensions for PHP 7.3 and 7.4"
log "PLAN do not weaken php.ini disable_functions; back up each php.ini before editing"

[ "$APPLY" -eq 1 ] || {
  log "SHADOW_ONLY: PHP extensions unchanged"
  exit 0
}

[ "$(id -u)" -eq 0 ] || die "PHP extension installation requires root"
[ -n "$APPROVAL_FILE" ] || die "--approval-file is required with --apply"
require_apply_authorization "install-php-extensions" "$APPROVAL_FILE" "$TARGET_HOST_REF"
require_cmd make
require_file /usr/include/mosquitto.h

BUILD_ROOT="$(mktemp -d /opt/zhct-install/php-ext.XXXXXX)"
BACKUP_DIR="$BACKUP_ROOT/php-extensions-$(date '+%Y%m%dT%H%M%S%z')"
mkdir -p "$BACKUP_DIR"
trap 'rm -rf "$BUILD_ROOT"' EXIT

install_one() {
  local php_prefix="$1"
  local php_ini="$php_prefix/etc/php.ini"
  require_file "$php_prefix/bin/php"
  require_file "$php_prefix/bin/phpize"
  require_file "$php_prefix/bin/php-config"
  require_file "$php_ini"
  cp -a "$php_ini" "$BACKUP_DIR/$(basename "$php_prefix")-php.ini"

  local redis_build="$BUILD_ROOT/$(basename "$php_prefix")-redis"
  local mqtt_build="$BUILD_ROOT/$(basename "$php_prefix")-mqtt"
  mkdir -p "$redis_build" "$mqtt_build"
  tar -xzf "$REDIS_SRC" -C "$redis_build" --strip-components=1
  tar -xzf "$MQTT_SRC" -C "$mqtt_build" --strip-components=1

  (
    cd "$redis_build"
    "$php_prefix/bin/phpize"
    ./configure --with-php-config="$php_prefix/bin/php-config" --enable-redis
    make -j"$(getconf _NPROCESSORS_ONLN)"
    make install
  )
  (
    cd "$mqtt_build"
    "$php_prefix/bin/phpize"
    ./configure --with-php-config="$php_prefix/bin/php-config"
    make -j"$(getconf _NPROCESSORS_ONLN)"
    make install
  )
  grep -qxF 'extension=redis.so' "$php_ini" || printf '%s\n' 'extension=redis.so' >> "$php_ini"
  grep -qxF 'extension=mosquitto.so' "$php_ini" || printf '%s\n' 'extension=mosquitto.so' >> "$php_ini"
  "$php_prefix/bin/php" -m | grep -qxF redis
  "$php_prefix/bin/php" -m | grep -qi '^mosquitto$'
}

install_one /usr/local/php
install_one /usr/local/php7.4
log "PHP_EXTENSIONS_INSTALLED backup=$BACKUP_DIR"
