#!/usr/bin/env bash
# AdminPVZ 1.1.107 — пользовательский диагностический запуск Debian 12 без sudo/root.
# Не устанавливает пакет в систему, не меняет WB и не отключает Chromium sandbox.
set -Eeuo pipefail

VERSION='1.1.107'
PACKAGE='AdminPVZ-1.1.107-amd64.deb'
EXPECTED_SHA256='e6e9b9093029be3142ead98efe86abf520a1a78062f2654793bc0806d740c1ef'
DOWNLOAD_URL="https://adminpvz.com/releases/linux-x64/${PACKAGE}"
LOG="$HOME/adminpvz-no-root-test-$(date +%Y%m%d-%H%M%S).log"
ROOT="$HOME/.local/share/adminpvz-no-root-test/${VERSION}"
APP="$ROOT/opt/AdminPVZ/adminpvz"
PROFILE="$ROOT/profile"

exec > >(tee -a "$LOG") 2>&1
printf 'AdminPVZ %s / тест без root\n' "$VERSION"
printf 'Журнал: %s\n' "$LOG"
printf '%s\n' '------------------------------------------------------'
printf '[1/7] Debian / пользователь / графическая сессия\n'
command -v id >/dev/null || { echo 'Нет команды id'; exit 1; }
printf 'Пользователь: %s; архитектура: %s\n' "$(id -un)" "$(uname -m)"
if [[ $(uname -m) != x86_64 ]]; then
    echo 'Ошибка: эта сборка предназначена только для Linux x86_64 (amd64).'
    exit 1
fi
if [[ -z "${DISPLAY:-}" && -z "${WAYLAND_DISPLAY:-}" ]]; then
    echo 'Ошибка: терминал открыт вне графического сеанса. Откройте терминал на рабочем столе XFCE.'
    exit 1
fi
if [[ -f /proc/sys/kernel/unprivileged_userns_clone ]]; then
    printf 'user namespaces: %s\n' "$(cat /proc/sys/kernel/unprivileged_userns_clone)"
fi

printf '[2/7] Поиск файла .deb\n'
package_path=''
for folder in "$HOME/Загрузки" "$HOME/Downloads" "$HOME/загрузки" "$HOME/Рабочий стол"; do
    if [[ -f "$folder/$PACKAGE" ]]; then package_path="$folder/$PACKAGE"; break; fi
done
if [[ -z "$package_path" ]]; then
    shopt -s nullglob
    for folder in "$HOME/Загрузки" "$HOME/Downloads"; do
        for candidate in "$folder"/*1.1.107*amd64.deb; do
            [[ -f "$candidate" ]] || continue
            package_path="$candidate"
            break 2
        done
    done
    shopt -u nullglob
fi
if [[ -z "$package_path" ]]; then
    mkdir -p "$HOME/Загрузки"
    package_path="$HOME/Загрузки/$PACKAGE"
    printf 'Файл отсутствует. Загружаем официальный пакет (%s) ...\n' "$DOWNLOAD_URL"
    if command -v curl >/dev/null 2>&1; then
        curl --fail --location --retry 2 --progress-bar --output "${package_path}.part" "$DOWNLOAD_URL"
    elif command -v wget >/dev/null 2>&1; then
        wget --progress=bar:force --output-document="${package_path}.part" "$DOWNLOAD_URL"
    else
        echo 'Нет curl/wget. Скачайте оригинальный .deb с https://adminpvz.com/site/download.html в папку Загрузки.'
        exit 1
    fi
    mv -- "${package_path}.part" "$package_path"
fi
printf 'Найден: %s\n' "$package_path"

printf '[3/7] Проверка SHA-256\n'
command -v sha256sum >/dev/null 2>&1 || { echo 'Команда sha256sum не найдена'; exit 1; }
actual_sha256="$(sha256sum -- "$package_path" | awk '{print $1}')"
if [[ "$actual_sha256" != "$EXPECTED_SHA256" ]]; then
    echo 'ОШИБКА: SHA-256 пакета не совпадает с опубликованной сборкой 1.1.107.'
    printf 'Получено: %s\nОжидалось: %s\n' "$actual_sha256" "$EXPECTED_SHA256"
    echo 'Запуск отменён. Проверьте ссылку/целостность загрузки.'
    exit 1
fi
echo 'Контрольная сумма совпадает.'

printf '[4/7] Распаковка в домашнюю папку\n'
command -v dpkg-deb >/dev/null 2>&1 || { echo 'Команда dpkg-deb не найдена'; exit 1; }
mkdir -p "$ROOT"
if [[ -f "$ROOT/.verified-sha256" && "$(cat "$ROOT/.verified-sha256")" == "$EXPECTED_SHA256" && -f "$APP" ]]; then
    echo 'Уже распакованная проверенная копия найдена.'
else
    # Для пробного запуска используются только локальные файлы этого пользователя.
    # dpkg-deb -x не регистрирует приложение и не требует прав root.
    dpkg-deb --extract "$package_path" "$ROOT"
    if [[ ! -f "$APP" ]]; then echo "Не найден исполняемый файл: $APP"; exit 1; fi
    printf '%s\n' "$EXPECTED_SHA256" > "$ROOT/.verified-sha256"
    echo 'Распаковано. Системные пакеты не изменены.'
fi
chmod 0755 "$APP" || { echo 'Нет прав на запуск извлечённого файла'; exit 1; }
# У обычного пользователя chrome-sandbox не может быть root-owned setuid helper.
# Отключаем только setuid-режим; kernel user-namespace sandbox остаётся включён.
if [[ -e "$ROOT/opt/AdminPVZ/chrome-sandbox" ]]; then
    chmod 0755 "$ROOT/opt/AdminPVZ/chrome-sandbox" || true
fi

printf '[5/7] Проверка библиотек Linux\n'
if command -v ldd >/dev/null 2>&1; then
    missing="$(ldd "$APP" 2>&1 | grep 'not found' || true)"
    if [[ -n "$missing" ]]; then
        echo 'Не найдены системные библиотеки:'
        printf '%s\n' "$missing"
        echo 'Без администратора нельзя поставить недостающие библиотеки штатным apt.'
        echo "Отправьте разработчику журнал: $LOG"
        exit 2
    fi
    echo 'Основные динамические библиотеки исполняемого файла доступны.'
else
    echo 'ldd отсутствует, проверка пропущена.'
fi

printf '[6/7] Создание отдельного тестового профиля\n'
mkdir -p "$PROFILE/config" "$PROFILE/cache" "$PROFILE/data"
export XDG_CONFIG_HOME="$PROFILE/config"
export XDG_CACHE_HOME="$PROFILE/cache"
export XDG_DATA_HOME="$PROFILE/data"
export ELECTRON_ENABLE_LOGGING=1

printf '[7/7] Запуск окна AdminPVZ без sudo\n'
echo 'Если окно открылось — это успешный первый этап. Для завершения закройте его.'
echo 'Не вводите рабочие пароли и не проверяйте рабочую выдачу товаров в тестовом профиле.'
echo "Если окно не открылось, отправьте журнал: $LOG"
set +e
"$APP" --disable-setuid-sandbox --enable-logging=stderr
code=$?
set -e
printf '\nКод завершения: %s\n' "$code"
if [[ "$code" -ne 0 ]]; then
    echo 'Пробный запуск завершился ошибкой. Пришлите журнал разработчику.'
    echo 'Опции --no-sandbox и sudo не использовались.'
else
    echo 'Процесс завершился с кодом 0. Подтвердите, что окно действительно появилось.'
fi
echo "Журнал: $LOG"
exit "$code"
