#!/bin/bash
# ─── APOS Market: Sudoers & Polkit Permissions Setup ───────────────
# Этот скрипт настраивает беспарольные права (NOPASSWD) и правила Polkit
# для тихой фоновой установки OTA-обновлений (.deb / .AppImage) и
# перезапуска службы/приложения без запроса пароля root.
# ───────────────────────────────────────────────────────────────────

set -e

# Убеждаемся, что запущен от root
if [ "$EUID" -ne 0 ]; then
  echo "❌ Ошибка: скрипт настройки прав должен запускаться с привилегиями root (sudo)."
  exit 1
fi

echo "⚙️  Настройка беспарольных прав установки обновлений APOS..."

# 1. Формирование /etc/sudoers.d/apos-updater
SUDOERS_FILE="/etc/sudoers.d/apos-updater"

cat > "$SUDOERS_FILE" << 'EOF'
# APOS Market NOPASSWD updater policy
ALL ALL=(ALL) NOPASSWD: /usr/bin/dpkg -i /tmp/apos-update.deb, /usr/bin/dpkg -i /tmp/*.deb, /opt/apos/scripts/install-update.sh, /bin/systemctl restart apos-market, /bin/systemctl restart apos-market.service, /usr/bin/pkill -f apos-market
EOF

chmod 0440 "$SUDOERS_FILE"
echo "✅ Создан файл правил sudoers: $SUDOERS_FILE"

# 2. Формирование правила Polkit /etc/polkit-1/localrules.d/50-apos-updater.rules
POLKIT_DIR="/etc/polkit-1/localrules.d"
mkdir -p "$POLKIT_DIR" 2>/dev/null || true
POLKIT_FILE="$POLKIT_DIR/50-apos-updater.rules"

cat > "$POLKIT_FILE" << 'EOF'
/* APOS Market PolicyKit rule for silent background OTA updates */
polkit.addRule(function(action, subject) {
    if ((action.id == "org.freedesktop.packagekit.system-update" ||
         action.id == "org.freedesktop.dpkg.pkexec" ||
         action.id == "org.freedesktop.policykit.exec") &&
        (action.lookup("command_line") && action.lookup("command_line").indexOf("install-update.sh") !== -1 ||
         action.lookup("command_line") && action.lookup("command_line").indexOf("apos-update") !== -1)) {
        return polkit.Result.YES;
    }
});
EOF

chmod 0644 "$POLKIT_FILE"
echo "✅ Создан файл правил Polkit: $POLKIT_FILE"

# 3. Создаем базовую директорию скриптов обновлений в /opt/apos/scripts/
mkdir -p /opt/apos/scripts 2>/dev/null || true

cat > /opt/apos/scripts/install-update.sh << 'EOF'
#!/bin/bash
# install-update.sh — Тихий фоновый скрипт установки скачанного обновления APOS Market
set -e

UPDATE_DEB="/tmp/apos-update.deb"
UPDATE_APPIMAGE="/tmp/apos-update.AppImage"
LOG_FILE="/var/log/apos-updater.log"

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🚀 Запуск тихой установки обновления..." >> "$LOG_FILE"

if [ -f "$UPDATE_DEB" ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 📦 Обнаружен DEB пакет. Установка via dpkg..." >> "$LOG_FILE"
    /usr/bin/dpkg -i "$UPDATE_DEB" >> "$LOG_FILE" 2>&1 || true
    rm -f "$UPDATE_DEB" 2>/dev/null || true
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ DEB пакет успешно установлен." >> "$LOG_FILE"
elif [ -f "$UPDATE_APPIMAGE" ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 📦 Обнаружен AppImage. Замена бинарника в /opt/apos/..." >> "$LOG_FILE"
    chmod +x "$UPDATE_APPIMAGE"
    cp -f "$UPDATE_APPIMAGE" /opt/apos/apos-market.AppImage
    rm -f "$UPDATE_APPIMAGE" 2>/dev/null || true
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✅ AppImage успешно обновлён." >> "$LOG_FILE"
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ⚠️ Файлы обновлений в /tmp/ не найдены." >> "$LOG_FILE"
    exit 1
fi

# Перезапуск приложения / службы
if systemctl is-active --quiet apos-market 2>/dev/null; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔄 Перезапуск службы apos-market..." >> "$LOG_FILE"
    systemctl restart apos-market >> "$LOG_FILE" 2>&1 || true
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🔄 Мягкий перезапуск процесса apos-market..." >> "$LOG_FILE"
    pkill -f apos-market || true
fi

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 🎉 Установка и перезапуск завершены." >> "$LOG_FILE"
EOF

chmod +x /opt/apos/scripts/install-update.sh
touch /var/log/apos-updater.log 2>/dev/null || true
chmod 666 /var/log/apos-updater.log 2>/dev/null || true

echo "✅ Тихий скрипт /opt/apos/scripts/install-update.sh создан и готов к использованию."
echo "🎉 Настройка прав беспарольного обновления выполнена успешно!"
