#!/usr/bin/env bash

# Decky Loader Official Installer (DeckyLoader.RU Edition)
# Official Server: https://deckyloader.ru

set -e

# Detect target user early
if [ -n "$SUDO_USER" ] && [ "$SUDO_USER" != "root" ]; then
    TARGET_USER="$SUDO_USER"
elif [ -n "$LOGNAME" ] && [ "$LOGNAME" != "root" ]; then
    TARGET_USER="$LOGNAME"
elif [ -d "/home/deck" ]; then
    TARGET_USER="deck"
else
    TARGET_USER="$(logname 2>/dev/null || whoami)"
fi

# 1. Detect GUI Environment
HAS_GUI=0
if [ -n "$DISPLAY" ] || [ -n "$WAYLAND_DISPLAY" ]; then
    if command -v kdialog >/dev/null 2>&1 || command -v zenity >/dev/null 2>&1; then
        HAS_GUI=1
    fi
fi

# 2. Version Choice (GUI or Terminal)
SELECTED_BRANCH="${DECKY_BRANCH:-}"

if [ -z "$SELECTED_BRANCH" ]; then
    if [ "$HAS_GUI" -eq 1 ]; then
        if command -v kdialog >/dev/null 2>&1; then
            CHOICE=$(kdialog --geometry 720x320 --title "Установка Decky Loader" --radiolist "Выберите версию Decky Loader для установки:" \
                "release" "Стабильная версия" on \
                "prerelease" "Предрелизная версия (Выбираем, если не работает стабильная)" off 2>/dev/null) || exit 0
            [ -n "$CHOICE" ] && SELECTED_BRANCH="$CHOICE"
        elif command -v zenity >/dev/null 2>&1; then
            CHOICE=$(zenity --list --radiolist --title="Установка Decky Loader" --text="Выберите версию Decky Loader для установки:" \
                --width=720 --height=320 \
                --column="" --column="Код" --column="Описание" \
                TRUE "release" "Стабильная версия" \
                FALSE "prerelease" "Предрелизная версия (Выбираем, если не работает стабильная)" --hide-column=2 2>/dev/null) || exit 0
            [ -n "$CHOICE" ] && SELECTED_BRANCH="$CHOICE"
        fi
    elif [ -e /dev/tty ] && [ -r /dev/tty ]; then
        echo "" > /dev/tty
        echo "==================================================" > /dev/tty
        echo "   🎮 Установка Decky Loader (deckyloader.ru)" > /dev/tty
        echo "==================================================" > /dev/tty
        echo "" > /dev/tty
        echo "Выберите версию для установки:" > /dev/tty
        echo "  1) Стабильная версия" > /dev/tty
        echo "  2) Предрелизная версия (Выбираем, если не работает стабильная)" > /dev/tty
        echo "" > /dev/tty
        read -r -p "Ваш выбор [1/2, по умолчанию: 1]: " USER_INPUT < /dev/tty || USER_INPUT="1"
        case "$USER_INPUT" in
            2|предрелиз*|тест*|prerelease|pre)
                SELECTED_BRANCH="prerelease"
                ;;
            *)
                SELECTED_BRANCH="release"
                ;;
        esac
    fi
fi

[ -z "$SELECTED_BRANCH" ] && SELECTED_BRANCH="release"

BRANCH_NAME_RU="Стабильная версия"
[ "$SELECTED_BRANCH" = "prerelease" ] && BRANCH_NAME_RU="Предрелизная версия"

# 3. Sudo Self-Elevation with Graphical Password Window
if [ "$(id -u)" -ne 0 ]; then
    TMP_SCRIPT="/tmp/decky_installer_$$.sh"
    if [ ! -f "$0" ] || [ "$0" = "sh" ] || [ "$0" = "bash" ] || [ "$0" = "dash" ]; then
        curl -fsSL --http1.1 --connect-timeout 10 "https://gitflic.ru/project/rosakodu/decky-loader/blob/raw?branch=main&file=scripts/install_release.sh" -o "$TMP_SCRIPT" || curl -fsSL --http1.1 --connect-timeout 10 "https://deckyloader.ru/install.sh" -o "$TMP_SCRIPT" || curl -fsSL --connect-timeout 10 "http://37.46.135.5/install.sh" -o "$TMP_SCRIPT"
        chmod +x "$TMP_SCRIPT"
        SCRIPT_TO_RUN="$TMP_SCRIPT"
    else
        SCRIPT_TO_RUN="$0"
    fi

    # Check if sudo already works without password prompt
    if sudo -n true 2>/dev/null; then
        exec sudo DECKY_BRANCH="$SELECTED_BRANCH" bash "$SCRIPT_TO_RUN" "$@"
    fi

    # Graphical password prompt when GUI is present
    if [ "$HAS_GUI" -eq 1 ]; then
        AUTH_SUCCESS=0
        while [ "$AUTH_SUCCESS" -eq 0 ]; do
            PASS=""
            if command -v kdialog >/dev/null 2>&1; then
                PASS=$(kdialog --title "Установка Decky Loader" --password "Введите пароль пользователя (${TARGET_USER}):" 2>/dev/null) || exit 0
            elif command -v zenity >/dev/null 2>&1; then
                PASS=$(zenity --password --title="Установка Decky Loader — Пароль (${TARGET_USER})" 2>/dev/null) || exit 0
            else
                break
            fi

            if [ -z "$PASS" ]; then
                exit 0
            fi

            if echo "$PASS" | sudo -S true 2>/dev/null; then
                AUTH_SUCCESS=1
                echo "$PASS" | sudo -S DECKY_BRANCH="$SELECTED_BRANCH" bash "$SCRIPT_TO_RUN" "$@"
                EXIT_CODE=$?
                [ -n "$TMP_SCRIPT" ] && rm -f "$TMP_SCRIPT" 2>/dev/null || true
                exit $EXIT_CODE
            else
                if command -v kdialog >/dev/null 2>&1; then
                    kdialog --title "Ошибка" --error "Неверный пароль. Пожалуйста, попробуйте ещё раз." 2>/dev/null || true
                elif command -v zenity >/dev/null 2>&1; then
                    zenity --error --title="Ошибка" --text="Неверный пароль. Пожалуйста, попробуйте ещё раз." 2>/dev/null || true
                fi
            fi
        done
    fi

    # Headless / SSH console fallback
    exec sudo DECKY_BRANCH="$SELECTED_BRANCH" bash "$SCRIPT_TO_RUN" "$@"
fi

USER_DIR="$(getent passwd "$TARGET_USER" | cut -d: -f6)"
[ -z "$USER_DIR" ] && USER_DIR="/home/${TARGET_USER}"
HOMEBREW_FOLDER="${USER_DIR}/homebrew"

echo "=== Установка Decky Loader (${BRANCH_NAME_RU}) ==="
echo "Целевой пользователь: ${TARGET_USER}"

# 4. Deep cleanup of old/original Decky Loader
echo "-> Очистка компонентов старого загрузчика..."
systemctl --user stop plugin_loader 2>/dev/null || true
systemctl --user disable plugin_loader 2>/dev/null || true
systemctl stop plugin_loader 2>/dev/null || true
systemctl disable plugin_loader 2>/dev/null || true

# Remove old systemd unit files
rm -f "/etc/systemd/system/plugin_loader.service"
rm -f "${USER_DIR}/.config/systemd/user/plugin_loader.service"
systemctl daemon-reload

# Remove old loader binaries, configs, logs and caches
# (plugins/ and data/ directories are completely preserved)
rm -rf "${HOMEBREW_FOLDER}/services"
rm -rf "${HOMEBREW_FOLDER}/settings"
rm -rf "${HOMEBREW_FOLDER}/logs"
rm -rf "/tmp/plugin_loader"*

# 5. Folder structure
echo "-> Создание структуры каталогов..."
mkdir -p "${HOMEBREW_FOLDER}/services"
mkdir -p "${HOMEBREW_FOLDER}/plugins"
mkdir -p "${HOMEBREW_FOLDER}/data"

# 6. CEF Remote Debugging
echo "-> Включение CEF Remote Debugging..."
mkdir -p "${USER_DIR}/.steam/steam"
touch "${USER_DIR}/.steam/steam/.cef-enable-remote-debugging"
if [ -d "${USER_DIR}/.var/app/com.valvesoftware.Steam/data/Steam" ]; then
    mkdir -p "${USER_DIR}/.var/app/com.valvesoftware.Steam/data/Steam"
    touch "${USER_DIR}/.var/app/com.valvesoftware.Steam/data/Steam/.cef-enable-remote-debugging"
fi

# 7. Download chosen PluginLoader binary (Prioritizing RU CDN GitFlic and HTTP/1.1)
BINARY_NAME="PluginLoader"
[ "$SELECTED_BRANCH" = "prerelease" ] && BINARY_NAME="PluginLoader-prerelease"

echo "-> Загрузка бинарного файла (${BRANCH_NAME_RU})..."
DOWNLOAD_SUCCESS=0

# Mirror 1: GitFlic Direct Russian CDN (Fastest in Russia, 0% DPI issues)
if curl -# -L -f --http1.1 --connect-timeout 15 "https://gitflic.ru/project/rosakodu/decky-loader/blob/raw?branch=main&file=${BINARY_NAME}" -o "${HOMEBREW_FOLDER}/services/PluginLoader"; then
    DOWNLOAD_SUCCESS=1
fi

# Mirror 2: deckyloader.ru with forced HTTP/1.1
if [ "$DOWNLOAD_SUCCESS" -eq 0 ]; then
    echo "⚠️ Переключение на сервер deckyloader.ru..."
    if curl -# -L -f --http1.1 --connect-timeout 15 "https://deckyloader.ru/${BINARY_NAME}" -o "${HOMEBREW_FOLDER}/services/PluginLoader"; then
        DOWNLOAD_SUCCESS=1
    fi
fi

# Mirror 3: Direct VPS IP
if [ "$DOWNLOAD_SUCCESS" -eq 0 ]; then
    echo "⚠️ Переключение на прямой IP сервера..."
    if curl -# -L -f --http1.1 --connect-timeout 15 "http://37.46.135.5/${BINARY_NAME}" -o "${HOMEBREW_FOLDER}/services/PluginLoader"; then
        DOWNLOAD_SUCCESS=1
    fi
fi

if [ "$DOWNLOAD_SUCCESS" -eq 0 ]; then
    echo "❌ Ошибка: не удалось загрузить PluginLoader. Проверьте интернет-соединение."
    exit 1
fi

chmod +x "${HOMEBREW_FOLDER}/services/PluginLoader"

# 8. Check for SELinux presence
if command -v getenforce >/dev/null 2>&1 && getenforce 2>/dev/null | grep -q "Enforcing"; then
    echo "-> Настройка контекста SELinux..."
    chcon -t bin_t "${HOMEBREW_FOLDER}/services/PluginLoader" 2>/dev/null || true
fi

if [ "$SELECTED_BRANCH" = "prerelease" ]; then
    echo "v3.3.0-pre6" > "${HOMEBREW_FOLDER}/services/.loader.version"
else
    echo "v3.2.10" > "${HOMEBREW_FOLDER}/services/.loader.version"
fi

# 9. Systemd service configuration
echo "-> Настройка службы systemd..."
cat > "/etc/systemd/system/plugin_loader.service" <<- EOM
[Unit]
Description=SteamDeck Plugin Loader (deckyloader.ru - ${SELECTED_BRANCH})
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
Restart=always
KillMode=process
TimeoutStopSec=15
ExecStart=${HOMEBREW_FOLDER}/services/PluginLoader
WorkingDirectory=${HOMEBREW_FOLDER}/services
Environment=UNPRIVILEGED_PATH=${HOMEBREW_FOLDER}
Environment=PRIVILEGED_PATH=${HOMEBREW_FOLDER}
Environment=PLUGIN_PATH=${HOMEBREW_FOLDER}/plugins
Environment=LOG_LEVEL=INFO

[Install]
WantedBy=multi-user.target
EOM

mkdir -p "${HOMEBREW_FOLDER}/services/.systemd"
cp -f "/etc/systemd/system/plugin_loader.service" "${HOMEBREW_FOLDER}/services/.systemd/plugin_loader.service"

# 10. Start & Enable service
echo "-> Запуск службы..."
systemctl daemon-reload
systemctl enable --now plugin_loader

# 11. Fix permissions for user
if [ "$TARGET_USER" != "root" ]; then
    chown -R "${TARGET_USER}:${TARGET_USER}" "${HOMEBREW_FOLDER}"
    chown -R root:root "${HOMEBREW_FOLDER}/services"
    chmod +x "${HOMEBREW_FOLDER}/services/PluginLoader"
fi

# Clean up temp file if exists
[ -n "$TMP_SCRIPT" ] && rm -f "$TMP_SCRIPT" 2>/dev/null || true

echo ""
echo "=================================================="
echo "✅ Decky Loader (${BRANCH_NAME_RU}) успешно установлен и запущен!"
echo "=================================================="
echo "Перейдите в игровой режим (Gaming Mode) и нажмите кнопку (○○○) — появится вкладка Decky."
