#!/usr/bin/env bash
set -eu

cat <<"EOF"
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣤⣶⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⠿⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⠀⠀⠀⠀⢀⣠⣴⣶⣿⣿⣿⣿⣿⣿⣿⣶⣦⣄⡀⠀⠀⠀⠀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⡆⠀⢀⣴⣿⣿⣿⣿⠿⠟⠛⠛⠛⠻⠿⣿⣿⣿⣿⣦⡀⠀⢰⣿⣿⣷⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⣿⠟⠉⠀⣴⣿⣿⣿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠻⣿⣿⣿⣦⠀⠉⠻⢿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣿⡿⠋⠀⠀⠀⣼⣿⣿⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢿⣿⣿⣧⠀⠀⠀⠙⢿⣿⣿⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⣿⣿⡿⠉⠀⠀⠀⠀⢰⣿⣿⣿⠁⠀⠀⠀⠀⣤⣾⣿⣿⣿⣷⣦⠀⠀⠀⠀⠈⣿⣿⣿⡆⠀⠀⠀⠀⠈⠻⣿⣿⣦⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⡿⡏⠀⠀⠀⠀⠀⠀⣼⣿⣿⡏⠀⠀⠀⠀⣼⣿⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⠀⢸⣿⣿⣷⠀⠀⠀⠀⠀⠀⢹⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⡇⠀⠀⠀⠀⠀⠀⢿⣿⣿⡇⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⢸⣿⣿⣿⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣷⡄⠀⠀⠀⠀⠀⢸⣿⣿⣷⠀⠀⠀⠀⠘⢿⣿⣿⣿⣿⣿⡿⠃⠀⠀⠀⠀⣼⣿⣿⡏⠀⠀⠀⠀⠀⢀⣾⣿⣿⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣦⣄⠀⠀⠀⠀⢿⣿⣿⣇⠀⠀⠀⠀⠀⠉⠛⠛⠛⠉⠀⠀⠀⠀⠀⣸⣿⣿⣿⠁⠀⠀⠀⣠⣴⣿⣿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣷⣤⡀⠀⠘⢿⣿⣿⣷⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣾⣿⣿⡿⠃⠀⢀⣠⣾⣿⣿⠿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣤⡀⠈⠻⢿⣿⣿⣶⠀⠀⠻⣿⣿⣿⣷⣦⣄⠀⠀⠀⠀⠀⣠⣤⣾⣿⣿⡿⠏⠁⠀⣴⣿⣿⣿⠟⠉⢀⣤⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢿⢿⠇⠀⠀⠀⠉⠛⠛⠀⠀⠀⠈⠙⠿⣿⣿⣿⣷⠀⠀⠀⣾⣿⣿⣿⠿⠁⠀⠀⠀⠀⠙⠛⠋⠀⠀⠀⠸⣿⣿⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⠀⠀⠀⣿⣿⣿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⠀⠀⠀⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⠀⠀⠀⣿⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢰⣵⣷⣄⠀⠀⠀⠀⠀⢀⣿⣿⣿⠀⠀⠀⣿⣿⣿⡄⠀⠀⠀⠀⠀⣠⣾⣷⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠻⣿⣿⣷⣦⣄⣀⣤⣾⣿⡿⠋⠀⠀⠀⠘⣿⣿⣷⣤⣀⣠⣤⣾⣿⡿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠻⠿⣿⣿⡟⠛⠁⠀⠀⠀⠀⠀⠀⠈⠘⠿⢿⣿⣿⠻⠏⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
EOF

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Installation destination
INSTALL_DESTINATION="$HOME/.local/share/ACCELA"

set +eu
# Check if zenity exists globally
command -v zenity &> /dev/null
ZENITY_AVAILABLE=$?
ZENITY_WORKS=1

if [ "$ZENITY_AVAILABLE" -eq 0 ]; then
    # Test if zenity is actually functional
    zenity --version >/dev/null 2>&1
    if [ $? -ne 0 ]; then
        ZENITY_WORKS=0
    fi
fi
set -eu

# Function to ask for confirmation
ask_confirm() {
    local prompt="$1"
    local default="${2:-n}"
    local response
    local zenity_result
    
    if [ "$ZENITY_WORKS" -eq 1 ]; then
        # Try to use zenity
        if [ "$default" = "y" ]; then
            zenity --question --text="$prompt" --ok-label="Yes" --cancel-label="No" --default-cancel 2>/dev/null
            zenity_result=$?
        else
            zenity --question --text="$prompt" --ok-label="Yes" --cancel-label="No" 2>/dev/null
            zenity_result=$?
        fi
        
        # Check if zenity worked
        if [ $zenity_result -eq 0 ] || [ $zenity_result -eq 1 ]; then
            return $zenity_result
        fi
        # If we get here, zenity failed
    fi
    
    # Fallback to terminal
    while true; do
        if [ "$default" = "y" ]; then
            read -r -p "$prompt [Y/n]: " response
        else
            read -r -p "$prompt [y/N]: " response
        fi
        
        case "${response:-$default}" in
            [Yy]* ) return 0;;
            [Nn]* ) return 1;;
            * ) echo "Please answer yes or no.";;
        esac
    done
}

# Check if notify-send exists globally
command -v notify-send &> /dev/null
NOTIFY_SEND_AVAILABLE=$?

# Logging functions
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
    set +eu
    if [ "$NOTIFY_SEND_AVAILABLE" -eq 0 ]; then
        notify-send -t 5000 "INFO" "$1" 2>/dev/null
    fi
    set -eu
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
    set +eu
    if [ "$NOTIFY_SEND_AVAILABLE" -eq 0 ]; then
        notify-send -t 5000 -u normal "WARNING" "$1" 2>/dev/null
    fi
    set -eu
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
    set +eu
    if [ "$NOTIFY_SEND_AVAILABLE" -eq 0 ]; then
        notify-send -t 5000 -u critical "ERROR" "$1" 2>/dev/null
    fi
    set -eu
}

echo -e "${GREEN}[INFO]${NC} ========================================="
log_info "        ACCELA Uninstall Script         "
echo -e "${GREEN}[INFO]${NC} ========================================="
echo ""

# Check if ACCELA is installed
if [ ! -d "$INSTALL_DESTINATION" ]; then
    log_warn "ACCELA installation not found at $INSTALL_DESTINATION"
    if ! ask_confirm "ACCELA installation not found at $INSTALL_DESTINATION\n\nDo you want to continue anyway?"; then
        log_info "Uninstall cancelled."
        exit 0
    fi
fi

# Remove source/binary version
rm -rf "$INSTALL_DESTINATION/src"              2>/dev/null
rm -f  "$INSTALL_DESTINATION/run.sh"           2>/dev/null
rm -rf "$INSTALL_DESTINATION/.venv"            2>/dev/null
rm -f  "$INSTALL_DESTINATION/ACCELA"           2>/dev/null
rm -f  "$INSTALL_DESTINATION/.version"         2>/dev/null
rm -f  "$INSTALL_DESTINATION/requirements.txt" 2>/dev/null
log_info "Removed core ACCELA files"

# Remove all data folders
if ask_confirm "Do you want to delete ACCELA data folders?\n\nThis includes:\n• SLScheevo\n• SLSsteam\n• steamless\n• gifs\n• depots\n• steam_headers.db\n• logs\n\nThese folders contain downloaded data and cached files."; then
    log_info "Removing data folders..."
    
    declare -a data_folders=(
        "SLScheevo"
        "SLSsteam"
        "steamless"
        "gifs"
        "depots"
        "logs"
    )
    
    for folder in "${data_folders[@]}"; do
        if [ -d "$INSTALL_DESTINATION/$folder" ]; then
            rm -rf "$INSTALL_DESTINATION/$folder" 2>/dev/null
            log_info "Removed: $INSTALL_DESTINATION/$folder"
        fi
    done
    
    if [ -f "$INSTALL_DESTINATION/steam_headers.db" ]; then
        rm -f "$INSTALL_DESTINATION/steam_headers.db" 2>/dev/null
        log_info "Removed: $INSTALL_DESTINATION/steam_headers.db"
    fi
else
    log_info "Skipping data folders removal."
fi

# Remove manifest cache
if [ -d "$INSTALL_DESTINATION/morrenus_manifests" ]; then
    if ask_confirm "Do you want to delete the manifest cache?\nThis contains cached manifest data that can be redownloaded if asked for again."; then
        rm -rf "$INSTALL_DESTINATION/morrenus_manifests" 2>/dev/null
        log_info "Removed: $INSTALL_DESTINATION/morrenus_manifests"
    else
        log_info "Skipping manifest cache removal."
    fi
else
    log_info "Manifest cache not found."
fi

# Remove settings
SETTINGS_DIR="$HOME/.config/Tachibana Labs"
if [ -d "$SETTINGS_DIR" ]; then
    if ask_confirm "Do you want to delete your settings? This includes all your ACCELA settings and Morrenus API key"; then
        rm -rf "$SETTINGS_DIR" 2>/dev/null
        log_info "Removed: $SETTINGS_DIR"
    else
        log_info "Skipping settings removal."
    fi
else
    log_info "Settings directory not found."
fi

# Remove desktop entry
DESKTOP_ENTRY="$HOME/.local/share/applications/accela.desktop"
if [ -f "$DESKTOP_ENTRY" ]; then
    rm -f "$DESKTOP_ENTRY" 2>/dev/null
    log_info "Removed: $DESKTOP_ENTRY"
    
    # Update desktop database
    if command -v update-desktop-database &>/dev/null; then
        update-desktop-database "$HOME/.local/share/applications" 2>/dev/null
        log_info "Updated desktop database"
    fi
fi

# Remove CLI wrapper
CLI_WRAPPER="$HOME/.local/bin/accela"
if [ -f "$CLI_WRAPPER" ]; then
    rm -f "$CLI_WRAPPER" 2>/dev/null
    log_info "Removed: $CLI_WRAPPER"
fi

# Remove icon
ICON_PATH="$HOME/.local/share/icons/hicolor/256x256/apps/accela.png"
if [ -f "$ICON_PATH" ]; then
    rm -f "$ICON_PATH" 2>/dev/null
    log_info "Removed: $ICON_PATH"
    
    # Update icon cache (skip GTK icon cache on KDE)
    if [ -z "${XDG_CURRENT_DESKTOP:-}" ] || [[ "$XDG_CURRENT_DESKTOP" != *"KDE"* ]]; then
        command -v gtk-update-icon-cache &>/dev/null && gtk-update-icon-cache "$HOME/.local/share/icons/hicolor" 2>/dev/null || true
        command -v gtk4-update-icon-cache &>/dev/null && gtk4-update-icon-cache "$HOME/.local/share/icons/hicolor" 2>/dev/null || true
        log_info "Updated icon cache"
    fi
fi

# Clean up empty installation directory
if [ -d "$INSTALL_DESTINATION" ]; then
    # Check if directory is empty
    if [ -z "$(ls -A "$INSTALL_DESTINATION")" ]; then
        rmdir "$INSTALL_DESTINATION" 2>/dev/null
        log_info "Removed empty directory: $INSTALL_DESTINATION"
    fi
fi

echo ""
echo -e "${GREEN}[INFO]${NC} ========================================="
log_info "ACCELA has been successfully uninstalled!"
echo -e "${GREEN}[INFO]${NC} ========================================="
