#!/bin/sh

# MARK: - Author Information
# Author: korboy
# Version: 1.1.1
# Description: A package manager utility for iOS jailbreak

# MARK: - Color Definitions
CYAN='\033[0;36m'
ORANGE='\033[0;33m'
WHITE='\033[1;37m'
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

# MARK: - Configuration
RECENT_PACKAGES_COUNT=10
AUTO_DISPLAY_RECENT=1
SETTINGS_FILE="/var/jb/var/mobile/Library/Preferences/rdpkg_settings.conf"

# MARK: - Root Check
if [ "$(id -u)" != "0" ]; then
    exec sudo "$0" "$@"
fi

# MARK: - Settings Management
load_settings() {
    if [ ! -f "$SETTINGS_FILE" ]; then
        mkdir -p "$(dirname "$SETTINGS_FILE")" 2>/dev/null
        echo "$RECENT_PACKAGES_COUNT" > "$SETTINGS_FILE"
        echo "$AUTO_DISPLAY_RECENT" >> "$SETTINGS_FILE"
    fi

    if [ -f "$SETTINGS_FILE" ]; then
        RECENT_PACKAGES_COUNT=$(head -n 1 "$SETTINGS_FILE" 2>/dev/null || echo "10")
        AUTO_DISPLAY_RECENT=$(sed -n '2p' "$SETTINGS_FILE" 2>/dev/null || echo "1")
        
        if ! echo "$RECENT_PACKAGES_COUNT" | grep -q '^[0-9]\+$'; then
            RECENT_PACKAGES_COUNT=10
        fi
        if ! echo "$AUTO_DISPLAY_RECENT" | grep -q '^[01]$'; then
            AUTO_DISPLAY_RECENT=1
        fi
    fi
}

save_settings() {
    mkdir -p "$(dirname "$SETTINGS_FILE")" 2>/dev/null
    echo "$RECENT_PACKAGES_COUNT" > "$SETTINGS_FILE"
    echo "$AUTO_DISPLAY_RECENT" >> "$SETTINGS_FILE"
}

# MARK: - UI Components
show_title() {
    clear
    printf "\n"
    printf "%b██████╗ ██████╗ ██████╗ ██╗  ██╗ ██████╗ %b\n" "$CYAN" "$NC"
    printf "%b██╔══██╗██╔══██╗██╔══██╗██║ ██╔╝██╔════╝ %b\n" "$CYAN" "$NC"
    printf "%b██████╔╝██║  ██║██████╔╝█████╔╝ ██║  ███╗%b\n" "$CYAN" "$NC"
    printf "%b██╔══██╗██║  ██║██╔═══╝ ██╔═██╗ ██║   ██║%b\n" "$CYAN" "$NC"
    printf "%b██║  ██║██████╔╝██║     ██║  ██╗╚██████╔╝%b\n" "$CYAN" "$NC"
    printf "%b╚═╝  ╚═╝╚═════╝ ╚═╝     ╚═╝  ╚═╝ ╚═════╝ %b\n" "$CYAN" "$NC"
    printf "\n"
}

show_menu() {
    show_title
    printf "%b╭───────────────────────────────────────╮%b\n" "$BLUE" "$NC"
    printf "%b│              %brdpkg Menu%b               │%b\n" "$BLUE" "$WHITE" "$BLUE" "$NC"
    printf "%b├───────────────────────────────────────┤%b\n" "$BLUE" "$NC"
    
    # Recent packages with colored count
    if [ "$RECENT_PACKAGES_COUNT" -lt 10 ]; then
        # Add extra space for single digit
        printf "%b│ %b[%b1%b]%b View Recent Packages %b(%b%d%b)%b          %b│%b\n" \
            "$BLUE" "$BLUE" "$WHITE" "$BLUE" "$NC" "$BLUE" "$ORANGE" "$RECENT_PACKAGES_COUNT" "$BLUE" "$NC" "$BLUE" "$NC"
    else
        # Normal spacing for double digits
        printf "%b│ %b[%b1%b]%b View Recent Packages %b(%b%d%b)%b         %b│%b\n" \
            "$BLUE" "$BLUE" "$WHITE" "$BLUE" "$NC" "$BLUE" "$ORANGE" "$RECENT_PACKAGES_COUNT" "$BLUE" "$NC" "$BLUE" "$NC"
    fi
    
    # Search packages
    printf "%b│ %b[%b2%b]%b ⌕ Search Installed Packages" "$BLUE" "$BLUE" "$WHITE" "$BLUE" "$NC"
    printf "       %b│%b\n" "$BLUE" "$NC"
    
    # Change count
    printf "%b│ %b[%b3%b]%b Change Recent Packages Count" "$BLUE" "$BLUE" "$WHITE" "$BLUE" "$NC"
    printf "      %b│%b\n" "$BLUE" "$NC"
    
    # Separator
    # printf "%b├───────────────────────────────────────┤%b\n" "$BLUE" "$NC"
    
    # Auto-display status
    if [ "$AUTO_DISPLAY_RECENT" = "1" ]; then
        printf "%b│ %b[%b4%b]%b Auto-Display Recent Packages %bON %b" "$BLUE" "$BLUE" "$WHITE" "$BLUE" "$NC" "$GREEN" "$NC"
        printf "  %b│%b\n" "$BLUE" "$NC"
    else
        printf "%b│ %b[%b4%b]%b Auto-Display Recent Packages %bOFF%b" "$BLUE" "$BLUE" "$WHITE" "$BLUE" "$NC" "$RED" "$NC"
        printf "  %b│%b\n" "$BLUE" "$NC"
    fi

    printf "%b├───────────────────────────────────────┤%b\n" "$BLUE" "$NC"
    
    # Fix Broken Packages
    printf "%b│ %b[%b5%b]%b Fix Broken Packages" "$BLUE" "$BLUE" "$WHITE" "$BLUE" "$NC"
    printf "               %b│%b\n" "$BLUE" "$NC"
    
    # Separator
    printf "%b├───────────────────────────────────────┤%b\n" "$BLUE" "$NC"
    
    # Exit option
    printf "%b│ %b[%b6%b]%b Exit" "$BLUE" "$BLUE" "$WHITE" "$BLUE" "$NC"
    printf "                              %b│%b\n" "$BLUE" "$NC"
    
    # Bottom border
    printf "%b╰───────────────────────────────────────╯%b\n" "$BLUE" "$NC"
    
    # Input prompt with arrow
    printf "\n%b→%b Choose an option (1-6): " "$CYAN" "$NC"
}

# MARK: - Feature Functions
show_recent_packages() {
    show_title
    printf "%b╭───────────────────────────────────────╮%b\n" "$BLUE" "$NC"
    printf "%b│      %bRecently Installed Packages%b      │%b\n" "$BLUE" "$WHITE" "$BLUE" "$NC"
    printf "%b╰───────────────────────────────────────╯%b\n" "$BLUE" "$NC"
    printf "\n"

    recent_packages=$(ls -t /var/jb/var/lib/dpkg/info/*.list | sed 's#.*/##; s/.list$//' | while read pkg; do
        if dpkg --get-selections "$pkg" 2>/dev/null | grep -v -E 'deinstall|gsc\.|cy\+|swift-|build-|llvm|clang' | grep -vw 'git' > /dev/null; then
            echo "$pkg"
        fi
    done | head -n "$RECENT_PACKAGES_COUNT")

    count=1
    echo "$recent_packages" | while read package; do
        if [ "$count" -lt 10 ]; then
            printf "%b[%b%d%b]%b %s%b\n" "$BLUE" "$WHITE" "$count" "$BLUE" "$ORANGE" "$package" "$NC"
        else
            printf "%b[%b%2d%b]%b %s%b\n" "$BLUE" "$WHITE" "$count" "$BLUE" "$ORANGE" "$package" "$NC"
        fi
        count=$((count + 1))
    done

    printf "\n%b→%b Enter package number (or press Enter to go back): " "$CYAN" "$NC"
    read choice

    if [ -z "$choice" ]; then
        return
    fi

    selected_package=$(echo "$recent_packages" | sed -n "${choice}p" 2>/dev/null)
    handle_package_selection "$selected_package"
}

change_recent_packages_count() {
    show_title
    printf "%b╭───────────────────────────────────────╮%b\n" "$BLUE" "$NC"
    printf "%b│      %bChange Recent Packages Count%b     │%b\n" "$BLUE" "$WHITE" "$BLUE" "$NC"
    printf "%b╰───────────────────────────────────────╯%b\n" "$BLUE" "$NC"
    printf "\n%bCurrent count:%b %d" "$WHITE" "$ORANGE" "$RECENT_PACKAGES_COUNT"
    printf "\n%b→%b Enter new count (1-50, or press Enter to cancel):\n\n→ %b" "$CYAN" "$NC" "$ORANGE"
    
    # Read input with orange color
    read new_count
    printf "$NC"  # Reset color after input

    if [ -z "$new_count" ]; then
        return
    fi

    # Combined validation: check if input is a valid number, within length and range
    if echo "$new_count" | grep -q '^[0-9]\+$' && [ ${#new_count} -le 2 ] && [ "$new_count" -gt 0 ] && [ "$new_count" -le 50 ]; then
        RECENT_PACKAGES_COUNT=$new_count
        save_settings
        printf "\n%b✓%b Recent packages count updated to %b%d%b\n" "$GREEN" "$WHITE" "$ORANGE" "$RECENT_PACKAGES_COUNT" "$NC"
        printf "\n%bPress Enter to continue...%b" "$CYAN" "$NC"
        read dummy
    else
        printf "\n%b✘%b Count must be between 1 and 50%b\n" "$RED" "$WHITE" "$NC"
        printf "\n%bPress Enter to continue...%b" "$CYAN" "$NC"
        read dummy
    fi
}

search_packages() {
    show_title
    printf "%b╭───────────────────────────────────────╮%b\n" "$BLUE" "$NC"
    printf "%b│       %bSearch Installed Packages%b       │%b\n" "$BLUE" "$WHITE" "$BLUE" "$NC"
    printf "%b╰───────────────────────────────────────╯%b\n" "$BLUE" "$NC"
    printf "\n%b⌕%b Enter search term (or press Enter to go back):\n\n⌕ " "$CYAN" "$NC"
    read search_term

    if [ -z "$search_term" ]; then
        return
    fi

    printf "\n%b⌕%b Searching for packages containing '%s'...%b\n\n" "$CYAN" "$WHITE" "$search_term" "$NC"
    
    search_results=$(dpkg -l | grep -i "$search_term" | awk '{print $2}' | grep -v -E 'gsc\.|cy\+|swift-|build-|llvm|clang' | grep -vw 'git')
    
    if [ -z "$search_results" ]; then
        printf "%b✘%b No packages found matching '%s'%b\n" "$RED" "$WHITE" "$search_term" "$NC"
        printf "\n%bPress Enter to continue...%b" "$CYAN" "$NC"
        read dummy
        return
    fi

    count=1
    echo "$search_results" | while read package; do
        if [ "$count" -lt 10 ]; then
            printf "%b[%b%d%b]%b %s%b\n" "$BLUE" "$WHITE" "$count" "$BLUE" "$ORANGE" "$package" "$NC"
        else
            printf "%b[%b%2d%b]%b %s%b\n" "$BLUE" "$WHITE" "$count" "$BLUE" "$ORANGE" "$package" "$NC"
        fi
        count=$((count + 1))
    done

    printf "\n%b→%b Enter package number (or press Enter to go back): " "$CYAN" "$NC"
    read choice

    if [ -z "$choice" ]; then
        return
    fi

    selected_package=$(echo "$search_results" | sed -n "${choice}p" 2>/dev/null)
    handle_package_selection "$selected_package"
}

toggle_auto_display() {
    if [ "$AUTO_DISPLAY_RECENT" = "1" ]; then
        AUTO_DISPLAY_RECENT=0
        printf "\n%b✘%b Auto-display %bdisabled%b" "$RED" "$WHITE" "$RED" "$NC"
    else
        AUTO_DISPLAY_RECENT=1
        printf "\n%b✓%b Auto-display %benabled%b" "$GREEN" "$WHITE" "$GREEN" "$NC"
    fi
    save_settings
    printf "\n\n%bPress Enter to continue...%b" "$CYAN" "$NC"
    read dummy
}

handle_package_selection() {
    selected_package="$1"
    if [ ! -z "$selected_package" ]; then
        printf "\n%b▶%b Selected Package: %b%s%b\n" "$CYAN" "$WHITE" "$ORANGE" "$selected_package" "$NC"
        printf "%b?%b Are you sure you want to uninstall this package? (y/n): " "$YELLOW" "$NC"
        read confirm
        confirm=$(echo "$confirm" | tr -d '\n')
        if [ "$confirm" = "y" ]; then
            printf "\n%b⟳%b Uninstalling package...%b\n" "$CYAN" "$WHITE" "$NC"
            dpkg -r "$selected_package" 2>/dev/null
            if [ $? -eq 0 ]; then
                printf "%b✓%b Package %b%s%b has been successfully uninstalled.%b\n" "$GREEN" "$WHITE" "$ORANGE" "$selected_package" "$GREEN" "$NC"
            else
                printf "%b✘%b Failed to uninstall package %b%s%b.%b\n" "$RED" "$WHITE" "$ORANGE" "$selected_package" "$RED" "$NC"
            fi
        else
            printf "\n%b✘%b Uninstallation canceled.%b\n" "$RED" "$WHITE" "$NC"
        fi
    else
        printf "\n%b✘%b Invalid choice.%b\n" "$RED" "$WHITE" "$NC"
    fi
    printf "\n%bPress Enter to continue...%b" "$CYAN" "$NC"
    read dummy
}

fix_broken_packages() {
    show_title
    printf "%b╭───────────────────────────────────────╮%b\n" "$BLUE" "$NC"
    printf "%b│         %bFix Broken Packages%b           │%b\n" "$BLUE" "$WHITE" "$BLUE" "$NC"
    printf "%b╰───────────────────────────────────────╯%b\n" "$BLUE" "$NC"
    
    printf "\n%b⟳%b Attempting to fix broken packages...%b\n\n" "$CYAN" "$WHITE" "$NC"
    
    if apt --fix-broken install 2>/dev/null; then
        printf "\n%b✓%b Package system has been successfully repaired.%b\n" "$GREEN" "$WHITE" "$NC"
    else
        printf "\n%b✘%b Failed to repair package system.%b\n" "$RED" "$WHITE" "$NC"
        printf "%b!%b Try running 'apt update' first and try again.%b\n" "$YELLOW" "$WHITE" "$NC"
    fi
    
    printf "\n%bPress Enter to continue...%b" "$CYAN" "$NC"
    read dummy
}

# MARK: - Main Execution
load_settings

if [ "$AUTO_DISPLAY_RECENT" = "1" ]; then
    show_recent_packages
fi

while true; do
    show_menu
    read option

    case $option in
        1) show_recent_packages ;;
        2) search_packages ;;
        3) change_recent_packages_count ;;
        4) 
            if [ "$AUTO_DISPLAY_RECENT" = "1" ]; then
                AUTO_DISPLAY_RECENT=0
            else
                AUTO_DISPLAY_RECENT=1
            fi
            save_settings
            ;;
        5) fix_broken_packages ;;
        6) 
            clear
            printf "\n%b✓%b Thank you for using rdpkg!%b\n\n" "$GREEN" "$WHITE" "$NC"
            exit 0
            ;;
        *)
            printf "\n%b✘%b Invalid option. Press Enter to continue...%b" "$RED" "$WHITE" "$NC"
            read dummy
            ;;
    esac
done