#!/bin/bash
set -euo pipefail

export RAVEOS_BASE_ETC_DIR="${RAVEOS_BASE_ETC_DIR:-/etc/raveos-app-installer}"
export RAVEOS_STATE_ROOT="${RAVEOS_STATE_ROOT:-/var/lib/raveos-app-installer}"
export RAVEOS_CACHE_ROOT="${RAVEOS_CACHE_ROOT:-/var/cache/raveos-app-installer}"
export RAVEOS_AUDIT_LOG_DIR="${RAVEOS_AUDIT_LOG_DIR:-/var/log/raveos-app-installer}"
export RAVEOS_INSTALL_LIB_DIR="${RAVEOS_INSTALL_LIB_DIR:-/usr/lib/raveos-app-installer}"
export RAVEOS_INSTALL_SHARE_DIR="${RAVEOS_INSTALL_SHARE_DIR:-/usr/share/raveos-app-installer}"
export RAVEOS_ACTIONS_DIR="${RAVEOS_ACTIONS_DIR:-$RAVEOS_INSTALL_LIB_DIR/actions}"
export RAVEOS_CONFIG_PACKAGE_DIR="${RAVEOS_CONFIG_PACKAGE_DIR:-$RAVEOS_INSTALL_SHARE_DIR/configs}"
export RAVEOS_THEME_PACKAGE_DIR="${RAVEOS_THEME_PACKAGE_DIR:-$RAVEOS_INSTALL_SHARE_DIR/themes}"

APP_ENTRY="${RAVEOS_INSTALL_LIB_DIR}/raveos-app-installer-root-launcher"

if [[ "$(id -u)" -eq 0 ]] && [[ -n "${SUDO_USER:-}" ]] && [[ "${SUDO_USER}" != "root" ]]; then
    ORIG_USER="${SUDO_USER}"
    ORIG_UID="${SUDO_UID:-$(id -u "$ORIG_USER")}"
    ORIG_GID="${SUDO_GID:-$(id -g "$ORIG_USER")}"
    ORIG_HOME="$(getent passwd "$ORIG_USER" | cut -d: -f6)"
    exec runuser -u "$ORIG_USER" -- env \
        HOME="$ORIG_HOME" \
        USER="$ORIG_USER" \
        LOGNAME="$ORIG_USER" \
        PATH="$PATH" \
        DISPLAY="${DISPLAY:-}" \
        WAYLAND_DISPLAY="${WAYLAND_DISPLAY:-}" \
        XAUTHORITY="${XAUTHORITY:-}" \
        XDG_CURRENT_DESKTOP="${XDG_CURRENT_DESKTOP:-}" \
        XDG_SESSION_TYPE="${XDG_SESSION_TYPE:-}" \
        XDG_SESSION_DESKTOP="${XDG_SESSION_DESKTOP:-}" \
        XDG_RUNTIME_DIR="/run/user/$ORIG_UID" \
        DBUS_SESSION_BUS_ADDRESS="${DBUS_SESSION_BUS_ADDRESS:-unix:path=/run/user/$ORIG_UID/bus}" \
        HYPRLAND_INSTANCE_SIGNATURE="${HYPRLAND_INSTANCE_SIGNATURE:-}" \
        /usr/bin/raveos-app-installer "$@"
fi

USER_RUNTIME_DIR="${XDG_RUNTIME_DIR:-/run/user/$(id -u)}"
DE="${XDG_CURRENT_DESKTOP:-unknown}"
DE_LOWER="$(printf '%s' "$DE" | tr '[:upper:]' '[:lower:]')"
CALLER_USER="$(id -un)"
CALLER_UID="$(id -u)"
CALLER_GID="$(id -g)"
CALLER_HOME="${HOME:-$(getent passwd "$CALLER_USER" | cut -d: -f6)}"

COMMON_ENV=(
    "RAVEOS_TARGET_USER=$CALLER_USER"
    "RAVEOS_TARGET_HOME=$CALLER_HOME"
    "RAVEOS_TARGET_UID=$CALLER_UID"
    "RAVEOS_TARGET_GID=$CALLER_GID"
    "PYTHONPATH=${RAVEOS_INSTALL_LIB_DIR}/src"
    "RAVEOS_BASE_ETC_DIR=$RAVEOS_BASE_ETC_DIR"
    "RAVEOS_STATE_ROOT=$RAVEOS_STATE_ROOT"
    "RAVEOS_CACHE_ROOT=$RAVEOS_CACHE_ROOT"
    "RAVEOS_AUDIT_LOG_DIR=$RAVEOS_AUDIT_LOG_DIR"
    "RAVEOS_INSTALL_LIB_DIR=$RAVEOS_INSTALL_LIB_DIR"
    "RAVEOS_INSTALL_SHARE_DIR=$RAVEOS_INSTALL_SHARE_DIR"
    "RAVEOS_ACTIONS_DIR=$RAVEOS_ACTIONS_DIR"
    "RAVEOS_CONFIG_PACKAGE_DIR=$RAVEOS_CONFIG_PACKAGE_DIR"
    "RAVEOS_THEME_PACKAGE_DIR=$RAVEOS_THEME_PACKAGE_DIR"
    "XDG_CURRENT_DESKTOP=${XDG_CURRENT_DESKTOP:-}"
    "XDG_SESSION_TYPE=${XDG_SESSION_TYPE:-}"
    "XDG_SESSION_DESKTOP=${XDG_SESSION_DESKTOP:-}"
    "XDG_RUNTIME_DIR=$USER_RUNTIME_DIR"
    "WAYLAND_DISPLAY=${WAYLAND_DISPLAY:-}"
    "HYPRLAND_INSTANCE_SIGNATURE=${HYPRLAND_INSTANCE_SIGNATURE:-}"
)

if [[ "$#" -eq 0 ]]; then
    export PYTHONPATH="${RAVEOS_INSTALL_LIB_DIR}/src"
    exec "$APP_ENTRY"
fi

if [[ "$DE_LOWER" == *"hyprland"* ]] || [[ "$DE_LOWER" == *"sway"* ]]; then
    xhost +local: 2>/dev/null || true
    if [[ -n "${DISPLAY:-}" ]]; then
        exec pkexec env \
            DISPLAY="$DISPLAY" \
            XAUTHORITY="${XAUTHORITY:-}" \
            QT_QPA_PLATFORM=xcb \
            "${COMMON_ENV[@]}" \
            "$APP_ENTRY" "$@"
    fi

    exec pkexec env \
        DISPLAY="${DISPLAY:-}" \
        XAUTHORITY="${XAUTHORITY:-}" \
        WAYLAND_DISPLAY="${WAYLAND_DISPLAY:-wayland-1}" \
        QT_QPA_PLATFORM=wayland \
        "${COMMON_ENV[@]}" \
        "$APP_ENTRY" "$@"
fi

exec pkexec env \
    DISPLAY="${DISPLAY:-:0}" \
    XAUTHORITY="${XAUTHORITY:-}" \
    QT_QPA_PLATFORM=xcb \
    "${COMMON_ENV[@]}" \
    "$APP_ENTRY" "$@"
