# If the tray indicator is live close it here
pkill -f "solseek-tray.py" || true

clear
if [ "$2" == 'check' ]; then
    rich "📦 [b]$MSG_GEN_CHECKUPDS[/b]" -p -a heavy -e -S "red" -C
    echo ""
    check_updates "system" "force"
    echo ""
    rich "[b]✓ $MSG_GEN_PROCCOMP[/b]" -p -a heavy -e -s "green" -S "green" -C
    read -p "$MSG_GEN_PRESSENTER..."
    exit 0
fi

shift $((OPTIND-1))
up_eo=0
up_mo=0
up_fp=0
up_sn=0
up_db=0
up_fw=0
up_cu=0
up_chk=0



for arg in "$@"; do
    if [[ "$arg" == *"="* ]]; then
        key="${arg%%=*}"
        value="${arg#*=}"
        declare "$key=$value"
    fi
done

ccache_eopkg=0
ccache_flatpak=0
ccache_updates=0
show_softreboot=0
show_hardreboot=0
reboot_msg=""


# If any update type requires sudo, lets take care of it here for aesthetics
if [ "$up_eo" -eq 1 ] || [ "$up_sn" -eq 1 ] || [ "$up_fw" -eq 1 ]; then

    rich "📦 [b]$MSG_UPD_TTLSTART[/b]" -p -a heavy -e -S "red" -C

    sudo echo ""

    # Check if user has eopkg clean days set
    if [[ "${SS_EOPKG_CLEAN_DAYS:-0}" -gt 0 ]]; then

        MIN_AGE=$(( SS_EOPKG_CLEAN_DAYS * 1440 ))

        # If the file does NOT exist (-f) OR if it is older than MIN_AGE
        if [[ ! -f "$EPD_CLEAN_CHK" ]] || [[ -n "$(find "$EPD_CLEAN_CHK" -mmin +"$MIN_AGE" 2>/dev/null)" ]]; then
            
            wait_for_eopkg 
            
            # Run the cleanup command silently
            sudo eopkg dc > /dev/null 2>&1 || true

            # Create the file or update its modified timestamp to now
            touch "$EPD_CLEAN_CHK"
        fi
    fi

    clear
fi

rich "📦 [b]$MSG_UPD_TTLSTART[/b]" -p -a heavy -e -S "red" -C
echo ""
rich "[b]‼️ $MSG_UPD_NOCLOSE ‼️[/b]" --rule --rule-style "red" -s "red"
echo ""

if [ "$up_eo" -eq 1 ] && [ "$SS_PKG_MGR" == "eopkg" ]; then
    ccache_eopkg=1
    ccache_updates=1
    show_hardreboot=1
    show_softreboot=1


    rich "[b] $(date +"%T") - EOPKG[/b]" -p -a heavy -e -W 50

    echo -e "${MSG_GEN_CHECKUPDS}\n"

    EOPKG_LOG="/var/log/eopkg.log"
    RETRY_EOPKG=true
    wait_for_eopkg

    while [ "$RETRY_EOPKG" = true ]; do

        START_LINE=$(wc -l < "$EOPKG_LOG" 2>/dev/null || echo 0)

        sudo eopkg up $SS_ASSUMEYES

        EOPKG_EXIT=$?

        # Read only the new lines added during execution and grep for ERROR
        NEW_ERRORS=$(tail -n +$((START_LINE + 1)) "$EOPKG_LOG" 2>/dev/null | grep "ERROR")

        #Check if eopkg exited with an error OR if the log recorded any errors
        if [ $EOPKG_EXIT -ne 0 ] || [ -n "$NEW_ERRORS" ]; then
            rich "⚠️ [b]$MSG_UPD_EOPKG_EH1[/b]!" -p -a heavy -e -S "red" -s "red"

            # Display the formatted errors
            if [ -n "$NEW_ERRORS" ]; then
                # Echoing through for a cleaner look
                echo -e "$NEW_ERRORS" | sed 's/^/  /'
            else
                echo -e "  Process failed (exit code $EOPKG_EXIT)"
            fi

            hr "danger" 3

            echo -e "${CSS_BOLDBRIGHT}$MSG_UPD_EOPKG_EHQ1 ${CSS_RESET}"
            echo -e "  ${CSS_BOLDBRIGHT}1)${CSS_RESET} $MSG_UPD_EOPKG_EHO1"
            echo -e "  ${CSS_BOLDBRIGHT}2)${CSS_RESET} $MSG_UPD_EOPKG_EHO2"
            echo -e "  ${CSS_BOLDBRIGHT}3)${CSS_RESET} $MSG_UPD_EOPKG_EHO3"
            echo ""

            read -n 1 -p "$MSG_UPD_EOPKG_EHQ2 [1-3]: " USER_CHOICE

            case "$USER_CHOICE" in
                1)
                    echo -e "\n$MSG_UPD_EOPKG_EHT1..."
                    sudo eopkg dc
                    echo ""
                    echo "$MSG_UPD_EOPKG_EHT1a..."
                    echo ""
                    # The loop will naturally restart here
                    ;;
                2)
                    echo -e "\n$MSG_UPD_EOPKG_EHT2..."
                    RETRY_EOPKG=false
                    ;;
                3)
                    echo -e "\n$MSG_UPD_EOPKG_EHT3"

                    exit 0
                    ;;
                *)
                    echo -e "\n$MSG_UPD_EOPKG_EHT4..."
                    RETRY_EOPKG=false
                    ;;
            esac
        else
            # Check the log delta for kernel/driver upgrades requiring a reboot
            if tail -n +$((START_LINE + 1)) "$EOPKG_LOG" 2>/dev/null | grep -qE 'Upgraded (nvidia-(open|glx|beta|470)|linux-(current|lts|headers|firmware)|intel-microcode)\b'; then
                show_softreboot=0
                reboot_msg="${MSG_GEN_REBOOTMSG}"
            fi

            RETRY_EOPKG=false
        fi

    done

    ###############################################################################

fi
if [ "$up_fp" -eq 1 ] && [ "$HAS_FLATPAK" -eq 1 ]; then
    ccache_flatpak=1
    ccache_updates=1

    echo ""
    rich "[b] $(date +"%T") - FLATPAK[/b]" -p -a heavy -e -W 50

    flatpak update -y
    flatpak mask
fi
if [ "$up_sn" -eq 1 ] && [ "$HAS_SNAP" -eq 1 ]; then
    echo ""
    rich "[b] $(date +"%T") - SNAP[/b]" -p -a heavy -e -W 50
    sudo snap refresh
fi
if [ "$up_db" -eq 1 ] && [ "$HAS_DISTROBOX" -eq 1 ]; then
    echo ""
    rich "[b] $(date +"%T") - DISTROBOX[/b]" -p -a heavy -e -W 50
    distrobox upgrade -a
fi
if [ "$up_cu" -eq 1 ] && [ "$HAS_CUSTOM" -eq 1 ]; then
    echo ""
    rich "[b] $(date +"%T") - $MSG_UPD_CUSTOM[/b]" -p -a heavy -e -W 50
    sh "$SS_CUST_UPDATE"
fi

if [ "$up_fw" -eq 1 ] && [ "$HAS_FIRMWARE" -eq 1 ]; then
    echo ""
    rich "[b] $(date +"%T") - FIRMWARE[/b]" -p -a heavy -e -W 50
    sudo fwupdmgr refresh --force
    sudo fwupdmgr get-updates -y > /dev/null
    sudo fwupdmgr update
fi

if [ "$ccache_updates" -eq 1 ]; then
    echo ""
    rich "[b]▒ $(date +"%T") - ${MSG_GEN_CACHE}[/b]" -p -a heavy -e -W 50
    check_updates "system" &
    if [ "$ccache_eopkg" -eq 1 ]; then
        eopkg_cache "force"
    fi
    if [ "$ccache_flatpak" -eq 1 ]; then
        fp_cache "force"
    fi
fi
echo ""
rich "[b]✓ $(date +"%T") - $MSG_GEN_PROCCOMP[/b]" -p -a heavy -e -s "green" -S "green" -C

OPTION_MENU="${CSS_GREENB}> ${MSG_GEN_PRESSENTER}"
if [ "$show_softreboot" -eq 1 ]; then
    OPTION_MENU="${OPTION_MENU} ${CSS_YELLOWB}> ${MSG_GEN_PRESSENTERRESB}"
fi
if [ "$show_hardreboot" -eq 1 ]; then
    OPTION_MENU="${OPTION_MENU} ${CSS_REDB}> ${MSG_GEN_PRESSENTERREB}"
fi
echo ""

if [ -n "$reboot_msg" ]; then

    rich "[b]‼️ ${reboot_msg} ‼️[/b]" -p -a heavy -e -W 50 -s "red" -S "red"
    echo ""
fi
# Clean up
rm -f "$ss_sysup_elog"

echo -e "${OPTION_MENU}${CSS_RESET}"

read -n 1 -p ": " PUCHOICE
case "$PUCHOICE" in
    # This matches either 'R' or 'r' (case-insensitive)
    [Ss])
        if [ "$show_softreboot" -eq 0 ]; then
            exit 0
        fi
        echo -e "\n\n${CSS_BOLDBRIGHT} $MSG_GEB_REBOOTIN... ${CSS_RESET}"
        RBCNT=3
        for (( i=$RBCNT; i>0; i-- )); do
            echo -ne "${CSS_BOLDBRIGHT} $i ${CSS_RESET}\r"
            sleep 1
        done
        systemctl soft-reboot
        ;;
    # This matches either 'R' or 'r' (case-insensitive)
    [Rr])

        if [ "$show_hardreboot" -eq 0 ]; then
            exit 0
        fi
        echo -e "\n\n${CSS_BOLDBRIGHT} $MSG_GEB_REBOOTIN... ${CSS_RESET}"
        RBCNT=3
        for (( i=$RBCNT; i>0; i-- )); do
            echo -ne "${CSS_BOLDBRIGHT} $i ${CSS_RESET}\r"
            sleep 1
        done
        reboot
        ;;
    *)
        exit 0
        ;;
esac


