#!/bin/sh
TASKS="$@"

PACMAN_UPDATE='yay -Sy && yay -Sy archlinux-keyring --needed --noconfirm'
PACMAN_UPGRADE='yay -Syu --noconfirm'
FLATPAK_UPDATE='/usr/bin/flatpak update -y --noninteractive'
DISTROBOX_UPDATE='/usr/bin/distrobox-upgrade -a'
PIP_UPDATE='/usr/bin/pipx upgrade-all'
PASSMGR_UPDATE='/usr/bin/pass git pull'

success() {
PROMPT="$1"
notify-send "󰇚 $PROMPT"
printf "\033[32m󰇚 %s\033[0m\n" "$PROMPT"
}

warn() {
PROMPT="$1"
printf "\033[33mWarning: %s\033[0m\n" "$PROMPT"
}

error() {
PROMPT="$1"
notify-send "Error: $PROMPT"
printf "\033[31mError: %s\033[0m\n" "$PROMPT"
}

pacman_update() {
if [ -d "/var/lib/pacman" ] ; then 
    $PACMAN_UPDATE && success "Updated pacman package index" && return 0
    error "Could not update pacman index"
    return 0
fi
warn "pacman not installed"
}

apt_update() {
[ -z "$sudopass" ] && sudopass="$(< /dev/null | menu "sudo:" pass)"
if [ -d "/var/lib/dpkg" ] && [ -e "/usr/bin/apt-get" ] ; then 
    printf '%s' "$sudopass" | sudo -S apt update && status="success"
    [ "$status" != "success" ] && error "Could not update apt index" && return 1
    upgradable="$(apt list --upgradable)"
    [ "$upgradable" != "Listing..." ] && success "Updates available"
    success "Updated apt package index" && return 0
    return 0
fi
warn "apt not installed"
}

pacman_upgrade() {
pacman_update
if [ -d "/var/lib/pacman" ] ; then 
    $PACMAN_UPGRADE && success "Updated pacman packages" && return 0
    error "Could not update pacman packages"
fi
}

apt_upgrade() {
[ -z "$sudopass" ] && sudopass="$(< /dev/null | menu "sudo:" pass)"
apt_update
if [ -d "/var/lib/dpkg" ] && [ -e "/usr/bin/apt-get" ] ; then 
    mkdir -p /tmp/apt-updater
    dpkg-query -l --no-pager | gzip > /tmp/apt-updater/previous
    printf '%s' "$sudopass" | sudo apt upgrade -y || status="$(echo 'error')"
    [ "$status" = "error" ] && error "Could not update apt packages"
    dpkg-query -l --no-pager | gzip > /tmp/apt-updater/current
    if [ -z "$(diff /tmp/apt-updater/current /tmp/apt-updater/previous)" ] ; then
        return 0
    else
        success "Updated apt packages"
        return 0
    fi
    rm -rf /tmp/apt-updater
    error "Could not update apt packages"
fi
}

flatpak_update() {
if [ -e "/usr/bin/flatpak" ] ; then 
    $FLATPAK_UPDATE
    success "Updated flatpak packages"
else
    warn "flatpak not installed"
fi
}

distrobox_update() {
if [ -e "/usr/bin/distrobox" ] ; then 
    $DISTROBOX_UPDATE
    success "Updated distrobox containers"
else
    warn "distrobox not installed"
fi
}

pip_update() {
if [ -e "/usr/bin/pipx" ] ; then
    status="$($PIP_UPDATE)"
    [ "$status" = "Versions did not change after running 'pipx upgrade' for each package 😴" ] && return 0
    success "Updated pipx packages"
else
    warn "pipx not installed"
fi
}

configs() {
for homecfg in /home/*/.config ; do
    status="$(/usr/bin/git -C $homecfg pull || echo 'error')"
    [ "$status" = "error" ] && error "Updating configs failed" && return 1
    if [ "$status" != "Already up to date." ] ; then
        success "Updated configs"
    fi
done
}

passmgr() {
if [ -e "/usr/bin/pass" ] ; then
    status="$($PASSMGR_UPDATE || echo 'error')"
    [ "$status" = "error" ] && error "Updating passwords failed" && return 1
    if [ "$status" != "Already up to date." ] ; then success "Updated passwords" ; fi
else
    warn "pass not installed"
fi
}

for TASK in $TASKS ; do $TASK ; done

sudopass=""