#!/usr/bin/sh
set -eu

_session_dir="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
GREETER_BIN="${NOCTALIA_GREETER_BIN:-${_session_dir}/noctalia-greeter}"
LOG_FILE="${NOCTALIA_GREETER_LOG:-/tmp/noctalia-greeter-greetd.log}"

# Log cage and greeter to one file.
exec >>"${LOG_FILE}" 2>&1

echo "=== noctalia-greeter-session $(date -Iseconds) pid=$$ uid=$(id -u) euid=$(id -u -r 2>/dev/null || id -u) ==="
echo "GREETER_BIN=${GREETER_BIN}"
echo "LOG_FILE=${LOG_FILE}"

# Private runtime dir; PAM XDG_RUNTIME_DIR may vanish before cage exits.
_pam_runtime="${XDG_RUNTIME_DIR:-unset}"
XDG_RUNTIME_DIR="/tmp/noctalia-runtime-$(id -u)"
export XDG_RUNTIME_DIR
mkdir -p "${XDG_RUNTIME_DIR}"
chmod 700 "${XDG_RUNTIME_DIR}"

echo "XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR} (pam=${_pam_runtime})"
echo "WAYLAND_DISPLAY=${WAYLAND_DISPLAY:-unset}"

unset WAYLAND_DISPLAY

_read_greeter_conf_value() {
  _key="$1"
  _conf="${NOCTALIA_GREETER_STATE_DIR:-/var/lib/noctalia-greeter}/greeter.conf"
  if [ ! -f "${_conf}" ]; then
    return 0
  fi
  _line=$(grep -E "^[[:space:]]*${_key}[[:space:]]*=" "${_conf}" | head -1) || return 0
  _val=${_line#*=}
  _val=$(printf '%s' "${_val}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' \
    -e 's/^"//' -e 's/"$//' -e "s/^'//" -e "s/'$//")
  printf '%s' "${_val}"
}

if ! command -v wlr-randr >/dev/null 2>&1; then
  echo "error: wlr-randr is required (Arch: extra/wlr-randr)"
  exit 1
fi

_share_dir="$(CDPATH= cd -- "${_session_dir}/../share/noctalia-greeter" 2>/dev/null && pwd || true)"
CAGE_ENTRY="${NOCTALIA_GREETER_CAGE_ENTRY:-${_share_dir}/noctalia-greeter-cage-entry}"
_output="$(_read_greeter_conf_value output)"

_cage_args="-s"
if [ -x "${CAGE_ENTRY}" ]; then
  _launch="${CAGE_ENTRY}"
  echo "cage entry=${CAGE_ENTRY}"
else
  echo "error: cage entry script not found at ${CAGE_ENTRY}"
  exit 1
fi
if [ -n "${_output}" ]; then
  export NOCTALIA_GREETER_OUTPUT="${_output}"
  echo "preferred output=${_output}"
fi

export GREETER_BIN

echo "launch: cage ${_cage_args} -- ${_launch} $*"
if command -v dbus-run-session >/dev/null 2>&1; then
  exec dbus-run-session -- env XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR}" \
    GREETER_BIN="${GREETER_BIN}" \
    NOCTALIA_GREETER_OUTPUT="${NOCTALIA_GREETER_OUTPUT:-}" \
    cage ${_cage_args} -- "${_launch}" "$@"
fi

echo "warn: dbus-run-session not found; starting cage without a session bus."
exec env XDG_RUNTIME_DIR="${XDG_RUNTIME_DIR}" \
  GREETER_BIN="${GREETER_BIN}" \
  NOCTALIA_GREETER_OUTPUT="${NOCTALIA_GREETER_OUTPUT:-}" \
  cage ${_cage_args} -- "${_launch}" "$@"
