#!/usr/bin/env bash
set -euo pipefail
ROOT="$(cd "$(dirname "$0")/.." && pwd)"
CONFIG="${EXOPLASIM_CONFIG:-$ROOT/config/web.json}"
[[ "$CONFIG" = /* ]] || CONFIG="$ROOT/$CONFIG"
readarray -t V < <(EXOPLASIM_CONFIG="$CONFIG" php -r '
require $argv[1]."/web/config/lab.php";
$c=lab_config();
foreach([$c["storage_root"],$c["worker_user"],$c["python"],$c["worker_memory_bytes"],$c["limits"]["max_cpus"]*100,$c["worker_nice"],$c["jobs"],$c["runtime"],$c["database"],$c["catalog"],$c["public_root"],$c["runtime_lock"]] as $v)echo $v,"\n";
' "$ROOT")
DATA=${V[0]}; WORKER=${V[1]}; PYTHON=${V[2]}; MEMORY=${V[3]}; CPU=${V[4]}; NICE=${V[5]}
JOBS=${V[6]}; RUNTIME=${V[7]}; DATABASE_FILE=${V[8]}; DATABASE_DIR="$(dirname "$DATABASE_FILE")"; CATALOG=${V[9]}; PUBLIC=${V[10]}; RUNTIME_LOCK=${V[11]}
[[ "$PUBLIC" = /* ]] || PUBLIC="$ROOT/$PUBLIC"
PHP_CLI="$(command -v php)"
if [[ "${1:-}" == '--dry-run' ]]; then
  printf 'Would publish PHP entry and browser assets to %s, install PHP worker from %s, and preserve runtime data in %s. No nginx configuration changes.\n' "$PUBLIC" "$ROOT" "$DATA"
  exit 0
fi
mkdir -p "$DATA"
exec 9>"$RUNTIME_LOCK"
flock -n 9 || { printf 'A runtime installation or job claim is in progress.\n' >&2; exit 1; }
if [[ -f "$DATABASE_FILE" ]]; then
  ACTIVE_JOBS=$("$PHP_CLI" -r '$db=new PDO("sqlite:".$argv[1]);echo (int)$db->query("SELECT COUNT(*) FROM jobs WHERE status IN (\"queued\",\"running\")")->fetchColumn();' "$DATABASE_FILE")
  if ((ACTIVE_JOBS > 0)); then printf 'Refusing to change runtime files while %s jobs are active.\n' "$ACTIVE_JOBS" >&2; exit 1; fi
fi
mkdir -p "$ROOT/tmp"
UNIT_PATH=/etc/systemd/system/exoplasim-worker.service
sed -e "s|@WORKER_USER@|$WORKER|g" -e "s|@PROJECT_ROOT@|$ROOT|g" -e "s|@CONFIG_FILE@|$CONFIG|g" -e "s|@PHP_CLI@|$PHP_CLI|g" -e "s|@JOBS@|$JOBS|g" -e "s|@RUNTIME@|$RUNTIME|g" -e "s|@DATABASE_DIR@|$DATABASE_DIR|g" -e "s|@MEMORY_MAX@|$MEMORY|g" -e "s|@CPU_QUOTA@|$CPU|g" -e "s|@NICE@|$NICE|g" "$ROOT/deploy/exoplasim-worker.service" > "$ROOT/tmp/exoplasim-worker.service"
getent passwd "$WORKER" >/dev/null || useradd --system --home-dir "$DATA" --shell /usr/sbin/nologin "$WORKER"
install -d -o root -g root -m 0755 "$DATA"
if [[ ! -e "$RUNTIME_LOCK" ]]; then : > "$RUNTIME_LOCK"; fi
chmod 0644 "$RUNTIME_LOCK"
install -d -o "$WORKER" -g www-data -m 0750 "$RUNTIME"
install -d -o www-data -g www-data -m 2770 "$DATABASE_DIR"
install -d -o "$WORKER" -g www-data -m 2750 "$JOBS"
install -d -o root -g root -m 0755 "$(dirname "$CATALOG")"
"$PYTHON" "$ROOT/scripts/web/parameters.py" --config "$CONFIG" --output "$CATALOG"
chown root:root "$CATALOG"
chmod 0644 "$CATALOG"
install -d -o "$WORKER" -g "$WORKER" -m 0750 "$RUNTIME/python"
rsync -a --delete --exclude='.git' --exclude='tmp' "$ROOT/exoplasim/" "$RUNTIME/python/exoplasim/"
chown -R "$WORKER:$WORKER" "$RUNTIME/python/exoplasim"
chmod -R u+rwX,go-w "$RUNTIME/python/exoplasim"
setfacl -m u:www-data:--x,u:"$WORKER":--x /root
install -d -m 0755 "$PUBLIC"
rsync -a --delete --include='*/' --include='*.js' --exclude='*' "$ROOT/web/js/" "$PUBLIC/js/"
install -d -m 0755 "$PUBLIC/themes/exoplasim/css"
rsync -a --delete --include='*.css' --exclude='*' "$ROOT/web/themes/exoplasim/css/" "$PUBLIC/themes/exoplasim/css/"
"$PHP_CLI" -r 'file_put_contents($argv[1]."/index.php", "<?php\nrequire ".var_export($argv[2]."/web/index.php",true).";\n");' "$PUBLIC" "$ROOT"
chmod 0644 "$PUBLIC/index.php"
install -m 0644 "$ROOT/tmp/exoplasim-worker.service" "$UNIT_PATH"
systemctl daemon-reload
systemctl enable exoplasim-worker.service
systemctl restart exoplasim-worker.service
printf 'Published the PHP workbench to %s. No nginx configuration changed.\n' "$PUBLIC"
