#!/bin/bash
set -e

LOG_DIR="/var/log/rudesktop"
LOG_FILE="$LOG_DIR/update_$(date +'%Y%m%d_%H%M%S').log"
sudo mkdir -p $LOG_DIR

log_message() {
    echo "$(date +'%Y-%m-%d %H:%M:%S') - $1" | sudo tee -a $LOG_FILE
}

# Prompt the user for input and return the response
# Usage: user_input=$(prompt_user "Enter your name")

prompt_user() {
    local message="$1"
    local default_value="$2"

    # If a default value is provided, show it in the prompt
    if [ -n "$default_value" ]; then
        read -p "${message} [${default_value}]: " response
        # If the user just hits enter, use the default value
        if [ -z "$response" ]; then
            response="$default_value"
        fi
    else
        read -p "${message}: " response
    fi

    echo "$response"
}

# Prompt the user for y/n and return the response
prompt_yn() {
    local message="$1"
    local default_value="${2:-}" # Optional default value (y/n)

    while true; do
        # Show prompt with default hint if provided
        if [ -n "$default_value" ]; then
            read -p "${message} [Д/н]: " response
            # If empty response, use default
            [ -z "$response" ] && response="$default_value"
        else
            read -p "${message} (д/н): " response
        fi

        # Check for valid input
        case "$response" in
        Y | y | Д | д)
            echo true
            return 0
            ;;
        N | n | Н | н)
            echo false
            return 0
            ;;
        *)
            echo "Неверное значение. Пожалуйста, введите Д/д или Н/н." >&2
            continue
            ;;
        esac
    done
}

log_message "Начало установки/обновления сервера rudesktop."

# Проверка системы
if command -v dpkg >/dev/null 2>&1; then
    log_message "Эта система на базе DEB."
else
    log_message "Эта система не на базе DEB. Выход."
    exit 1
fi

# Добавление репозитория и публичного ключа
log_message "Добавление репозитория и публичного ключа."
sudo mkdir -p /usr/share/keyrings/
wget -qO - https://storage.rudesktop.ru/repos/stable2.8/rudesktop.gpg | sudo gpg --yes --dearmor -o /usr/share/keyrings/rudesktop.gpg
echo "deb [signed-by=/usr/share/keyrings/rudesktop.gpg] https://storage.rudesktop.ru/repos/stable2.8 stable2.8 non-free" | sudo tee /etc/apt/sources.list.d/rudesktop.list

sudo apt-get update -y

if ! dpkg-query -l rudesktop-server >/dev/null 2>&1; then
    # Установка сервера rudesktop
    log_message "Установка сервера rudesktop."
    sudo apt-get install rudesktop-server -y
    if [ $? -eq 0 ]; then
        log_message "Сервер rudesktop успешно установлен."
    else
        log_message "Ошибка при установке сервера rudesktop."
        exit 1
    fi
else
    # Обновление сервера rudesktop
    log_message "Обновление сервера rudesktop."

    installed_version=$(dpkg-query -W -f='${Version}\n' rudesktop-server | cut -d. -f1,2,3)
    force_backup_available="2.8.1233"
    if dpkg --compare-versions "$installed_version" gt "$force_backup_available"; then
        need_backup=$(prompt_yn "Создать бэкап базы данных?" "Д")
        if [ $need_backup = "false" ]; then
            export SKIP_BACKUP=true
        else
            export FORCE_BACKUP=true
            export BACKUP_PATH=$(prompt_user "Укажите путь до бэкапа" "/var/lib/rudesktop/upgrade_backup.gz")
        fi
    fi

    sudo -E apt-get install --only-upgrade rudesktop-server -y
    if [ $? -eq 0 ]; then
        log_message "Сервер rudesktop успешно обновлён."
    else
        log_message "Ошибка при обновлении сервера rudesktop."
        exit 1
    fi
fi

log_message "Установка/обновление сервера rudesktop завершено."
