#!/bin/sh
# Upgrade script for
# some GNU/Linux distros

# Clean previous logs
rm -rf "$XDG_STATE_HOME"/upgrade_logs_*

# Get pkgmanager name
[ -d "/var/lib/pacman" ] && pkgmanager="pacman"
[ -d "/var/lib/dpkg" ] && pkgmanager="apt"
[ -d "/var/db/xbps" ] && pkgmanager="xbps"

# Prompts
printf "Update repository index? ($pkgmanager) [y/N]: "
read -r ind # Repository index
printf "Update packages? ($pkgmanager & flatpak) [y/N]: "
read -r pkg # Packages
printf "Update configs? (~/.config/) [y/N]: "
read -r cfg # Configs
printf "Update source-built? (~/.local/src/) [y/N]: "
read -r src # Source built
printf "Update password vault? [y/N]: "
read -r pss # Passwords

# Functions for each pkgmanager (missing xbps)
update() {
case $pkgmanager in
    "pacman") yay -Sy && yay -Sy archlinux-keyring --needed --noconfirm >> "$XDG_STATE_HOME"/upgrade_logs_pkg ;;
    "apt") sudo apt-get update >> "$XDG_STATE_HOME"/upgrade_logs_pkg ;;
    "xbps") echo "TBD" ;;
esac
}

upgrade() {
case $pkgmanager in
    "pacman") yay -Syu --noconfirm ;;
    "apt") sudo apt-get upgrade -y ;;
    "xbps") echo "TBD" ;;
esac
}

# Script steps
index() {
printf "\n\033[1m"Updating"\033[0m \033[1m"package"\033[0m \033[1m"index..."\033[0m\n"
update
}

packages() {
printf "\n\033[1m"Upgrading"\033[0m \033[1m"packages..."\033[0m\n"
upgrade
flatpak update -y --noninteractive >> "$XDG_STATE_HOME"/upgrade_logs_pkg
}

configs() {
printf "\n\033[1m"Updating"\033[0m \033[1m"configs..."\033[0m\n"
git -C ~/.config pull >> "$XDG_STATE_HOME"/upgrade_logs_git
}

sources() {
printf "\n\033[1m"Getting"\033[0m \033[1m"and"\033[0m \033[1m"building"\033[0m \033[1m"source..."\033[0m\n"
for dir in ~/.local/src/* ; do
    git -C $dir pull >> "$XDG_STATE_HOME"/upgrade_logs_git
    if [ "$(diff $dir/config.h $dir/config.def.h)" != "" ] ; then
        printf "Found diffs in $dir/config.def.h, apply? [y/N]: "
        read -r diff
        [ "$diff" = "y" ] && rm -rf "$dir"/config.h
    fi
    sudo make clean install -C "$dir" >> "$XDG_STATE_HOME"/upgrade_logs_src
done
}

passwords() {
printf "\n\033[1m"Getting"\033[0m \033[1m"passwords..."\033[0m\n"
pass git pull >> "$XDG_STATE_HOME"/upgrade_logs_git
}

# Error control
[ "$ind" = "y" ] && index &&
    notify-send "󰇚 Repositories" "Updated repository index" || notify-send "󰇚 Repositories" "Couldn't complete"

[ "$pkg" = "y" ] && packages &&
    notify-send "󰇚 Packages" "Updated package base" || notify-send "󰇚 Packages" "Couldn't complete"

[ "$cfg" = "y" ] && configs &&
    notify-send "󰇚 Configs" "Updated configs" || notify-send "󰇚 Configs" "Coudn't complete"

[ "$src" = "y" ] && sources &&
    notify-send "󰇚 Source" "Updated source builds" || notify-send "󰇚 Source" "Coudn't complete"

[ "$pss" = "y" ] && passwords &&
    notify-send "󰇚 Passwords" "Updated password vault" || notify-send "󰇚 Passwords" "Coudn't complete"

printf "\n\033[1m"Done!"\033[0m\n"
notify-send "󰇚 Upgrade complete"