#!/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
}
# Returns:
#   0 if versions are equal
#   1 if version1 > version2
#   2 if version1 < version2

compare_versions() {
    local v1=(${1//./ }) # Split into array (MAJOR MINOR PATCH)
    local v2=(${2//./ })

    # Compare MAJOR, MINOR, PATCH in order
    for i in 0 1 2; do
        if [[ "${v1[$i]}" -gt "${v2[$i]}" ]]; then
            echo 1
            return
        elif [[ "${v1[$i]}" -lt "${v2[$i]}" ]]; then
            echo 2
            return
        fi
    done
    echo 0 # All components equal
}

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

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

# Добавление репозитория
log_message "Добавление репозитория"
sudo bash -c "cat << EOF > /etc/yum.repos.d/rudesktop.repo
[rudesktop]
name=Rudesktop
baseurl=https://storage.rudesktop.ru/repos/stable3.0/rpms
gpgcheck=0
enabled=1
EOF"

if ! rpm -q rudesktop-server; then
    # Установка сервера rudesktop
    log_message "Установка сервера rudesktop."
    sudo dnf 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=$(rpm -q --qf '%{VERSION}\n' rudesktop-server | cut -d. -f1,2,3)
    force_backup_available="2.8.1233"

    res=$(compare_versions "$installed_version" "$force_backup_available")

    if [[ "$res" -eq 1 ]]; 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 dnf update rudesktop-server -y
    if [ $? -eq 0 ]; then
        log_message "Сервер rudesktop успешно обновлён."
    else
        log_message "Ошибка при обновлении сервера rudesktop."
        exit 1
    fi
fi

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