#!/usr/bin/env bash
# Root-обёртка для веб-мастера. Вызывается только через sudo из PHP (www-data).
set -euo pipefail

STATE_DIR="${WR_CMS_INSTALLER_STATE:-/var/lib/wrcms-installer}"
JOB_FILE="${STATE_DIR}/job.json"
LOG_FILE="${STATE_DIR}/install.log"
LOCK_FILE="${STATE_DIR}/installed"
RUNNING_FILE="${STATE_DIR}/running"
ERROR_FILE="${STATE_DIR}/error.txt"
PHP_ROOT="${STATE_DIR}/www/install"

cmd="${1:-}"

if [ "$(id -u)" -ne 0 ]; then
  echo "нужен root" >&2
  exit 1
fi

run_job() {
  if [ ! -f "$JOB_FILE" ]; then
    echo "нет job.json" >"$ERROR_FILE"
    rm -f "$RUNNING_FILE"
    exit 1
  fi

  # shellcheck disable=SC1091
  eval "$(python3 - <<'PY'
import json, shlex
from pathlib import Path
job = json.loads(Path("/var/lib/wrcms-installer/job.json").read_text(encoding="utf-8"))
def exp(k, default=""):
    v = job.get(k, default)
    if isinstance(v, bool):
        v = "y" if v else "n"
    print(f'{k}={shlex.quote(str(v if v is not None else default))}')
exp("domain")
exp("letsencryptEmail")
exp("adminEmail")
exp("adminName", "Администратор")
exp("adminPassword")
exp("installDir", "/opt/wrcms")
exp("setupTls", "y")
exp("releaseRoot")
PY
)"

  : "${domain:?}"
  : "${releaseRoot:?}"
  INSTALL_SH="${releaseRoot}/install/install.sh"
  if [ ! -f "$INSTALL_SH" ]; then
    echo "не найден ${INSTALL_SH}" >"$ERROR_FILE"
    rm -f "$RUNNING_FILE"
    exit 1
  fi

  mkdir -p "$(dirname "$LOG_FILE")"
  : >"$LOG_FILE"
  rm -f "$ERROR_FILE"

  set +e
  env \
    WR_CMS_NONINTERACTIVE=1 \
    WR_CMS_DOMAIN="$domain" \
    WR_CMS_LETSENCRYPT_EMAIL="$letsencryptEmail" \
    WR_CMS_ADMIN_EMAIL="$adminEmail" \
    WR_CMS_ADMIN_NAME="$adminName" \
    WR_CMS_ADMIN_PASSWORD="$adminPassword" \
    WR_CMS_INSTALL_DIR="$installDir" \
    WR_CMS_SETUP_TLS="$setupTls" \
    bash "$INSTALL_SH" >>"$LOG_FILE" 2>&1
  code=$?
  set -e

  rm -f "$RUNNING_FILE"
  if [ "$code" -eq 0 ]; then
    date -u +%Y-%m-%dT%H:%M:%SZ >"$LOCK_FILE"
    # отключаем публичный мастер
    if [ -d "$PHP_ROOT" ]; then
      echo '<?php http_response_code(410); echo "installed";' >"${PHP_ROOT}/index.php"
    fi
    rm -f /etc/sudoers.d/wrcms-installer 2>/dev/null || true
    rm -f /etc/nginx/sites-enabled/wrcms-installer.conf 2>/dev/null || true
    if command -v nginx >/dev/null 2>&1 && nginx -t 2>/dev/null; then
      systemctl reload nginx 2>/dev/null || true
    fi
    exit 0
  fi
  echo "install.sh exit ${code}" >"$ERROR_FILE"
  exit "$code"
}

case "$cmd" in
  start)
    # уже в фоне от PHP; если вызвали синхронно — тоже ок
    nohup bash "$0" run >>"$LOG_FILE" 2>&1 &
    echo $! >"${STATE_DIR}/pid"
    ;;
  run)
    run_job
    ;;
  *)
    echo "usage: wrcms-run-install start|run" >&2
    exit 2
    ;;
esac
