#!/bin/bash

if [ $(id -u) -eq 0 ]; then
  echo "Нельзя запускать epmgpi от пользователя root."
  exit 1
fi

# Временные файлы
clean_up_tmp() {
  rm -fr "$EPMGPI_TMP"
}

EPMGPI_TMP=$(mktemp -d -t epmgpi.XXXXXXX)
# shellcheck disable=SC2064
trap "clean_up_tmp $EPMGPI_TMP" EXIT

EPMGPI_LOG_FILE="$EPMGPI_TMP/epmgpi.log"

# Дефолтные параметры yad
YAD_DEFAULT="/usr/bin/yad --window-icon=epmgpi --title=epmgpi --class=epmgpi"

VALID_FILE_EXTENSIONS=(
    "*.rpm" "*.deb" "*.run"
    "*.appimage" "*.AppImage" "*.Appimage"
)

# Уведомления
ntf() {
    notify-send --icon=epmgpi "$1"
}

# Уведомление об ошибке
ntf_error() {
    notify-send  --icon=error "$1"
}

# Функция для вопроса пользователю, перепаковать ли пакет
repackq() {
        # Не rpm файлы перепаковываются и без ключа --repack
        if [[ $PKG_PATH == *.rpm ]]; then

        $YAD_DEFAULT --image="dialog-question" --text "Перепаковать ли rpm файл для переопределения зависимостей?" \
      --button="yad-yes:0" \
      --button="yad-no:1"
      
        local ANSWER=$?

        if [[ $ANSWER -eq 0 ]]; then
            local EEPM_ARGS="--auto --repack -i"
        else
            local EEPM_ARGS="--auto -i"
        fi
    else
        local EEPM_ARGS="--auto -i"
    fi
    echo "$EEPM_ARGS"
}

# GUI селектор пакетов
pkgselection() {
    $YAD_DEFAULT --file --file-filter="${VALID_FILE_EXTENSIONS[*]}"
}

yad_log_view() {
    $YAD_DEFAULT --title="Лог ошибки" --no-buttons --text-align=center \
    --text-info --show-uri --wrap --width=1200 --height=550 --uri-color=red \
    --filename="$EPMGPI_LOG_FILE"
    rm "$EPMGPI_LOG_FILE"
    exit 1
}

epmgpi_logging() {
    tee -a "$EPMGPI_LOG_FILE"
}

# Проверка, пакет ли файл
hack_for_paths_with_spaces() {
    PKG_PATH="$1"
    local PKG_NAME
    PKG_NAME=$(basename -- "$PKG_PATH" | tr -d ' ')
    local PKG_SYMB_LINK_PATH="$EPMGPI_TMP/$PKG_NAME"
    ln -s "$PKG_PATH" "$PKG_SYMB_LINK_PATH"
    echo "$PKG_SYMB_LINK_PATH"
}

# Установка пакета
installpkg() {
    local PKG_PATH="$1"
    local EEPM_ARGS="$2"
    # Pkexec для выполнения от рута
    # Тут есть костыль, который каждую строку с помощью sed делает с решеткой. YAD воспринимает только так.
    ( 
        # shellcheck disable=SC2086
        /usr/bin/pkexec /usr/bin/epm $EEPM_ARGS "$PKG_PATH" 2>&1
        exit_code=$?

        case $exit_code in
            0)
                echo "Команда завершилась успешно"
                ntf "Пакет установлен!"
                exit 0
                ;;
            100)
                ntf_error "Пакет не установлен. Команда завершилась с ошибкой."
                echo "!!! ОШИБКА EPMGPI" >> "$EPMGPI_LOG_FILE"
                ;;

            126)
                ntf_error "Пакет не установлен. Действие прервано пользователем."
                exit 1
                ;;
            *)
                ntf_error "Пакет не установлен."
                echo "!!! ОШИБКА EPMGPI" >> "$EPMGPI_LOG_FILE"
                ;;
        esac
    
    ) | epmgpi_logging | sed -u 's/^/# /' | $YAD_DEFAULT \
    --title="Установка пакета" \
    --progress --width=800 --height=500 \
    --enable-log="Лог" --log-expanded --log-on-top \
    --auto-kill --auto-close
}

show_help() {
    echo "Использование: $0 [опция] [путь-к-пакету]"
    echo "Опции:"
    echo "  --help, -h       Показать эту справку"
    echo "  --version, -v    Показать информацию о версии"
    echo "Передайте путь к пакету, если не хотите использовать окно выбора файла."
}

main() {
    local PKG_PATH
    local FILE_PATH
    FILE_PATH="$1"
    # Проверка и вызов окна выбора файлов, если PKG_PATH не установлен
    if [[ -z "$FILE_PATH" ]]; then
        echo "Путь к пакету не указан. Вызов функции выбора пакета..."
        FILE_PATH=$(pkgselection)
    fi
    
    if [ ! -f "$FILE_PATH" ]; then
        echo "Ошибка: $FILE_PATH - это не файл."
        exit 1
    fi
    
    if echo "$FILE_PATH" | grep -q " "; then
        echo "Путь к пакету содержит пробелы"
        PKG_PATH=$(hack_for_paths_with_spaces "$FILE_PATH")
    else
        PKG_PATH=$FILE_PATH
    fi

    installpkg "$PKG_PATH" "$(repackq)"

    if grep -q "!!! ОШИБКА EPMGPI" "$EPMGPI_LOG_FILE" ; then
        yad_log_view
    fi
}

if [[ $# -eq 0 ]]; then
    main | epmgpi_logging
else
    # Обработка аргументов
    while [[ $# -gt 0 ]]; do
        case "$1" in
            --help|-h)
                show_help
                exit 0
                ;;
            --version|-v)
                echo "Версия 1.4"
                exit 0
                ;;
            *)
                echo "Переданы аргументы: $1"
                main "$(realpath "$1")" | epmgpi_logging
                shift
                ;;
        esac
    done
fi