#!/bin/sh
set -eu

usage () {
    echo "Usage: $(basename "$0") [-d] [$(list_supported | tr '\n' '|')]"
}

header () {
    printf '\n\e[1;92m=== %s ====\e[0m\n\n' "$*" >&2
}

fail() {
    printf '\e[1;91m%s\e[0m\n' "$*" >&2
    exit 1
}

has() {
    command -v "$1" >/dev/null 2>&1
}

_apt () {
    has apt-get || fail apt-get not found.
    header Updating APT
    if [ -n "${DOWNLOAD_ONLY:-}" ]
    then
        sudo /bin/sh -c 'apt-get update && apt-get dist-upgrade -o DPkg::Lock::Timeout=300 --download-only --yes && apt-get autoclean'
    else
        sudo /bin/sh -c 'apt-get update && apt-get dist-upgrade -o DPkg::Lock::Timeout=300 --yes --auto-remove --purge && apt-get autoclean'
    fi
}

_flatpak() {
    has flatpak || fail flatpak not found.
    header Updating Flatpak
    flatpak --system update --appstream

    if [ -n "${DOWNLOAD_ONLY:-}" ]
    then
        flatpak --system update --assumeyes --no-deploy
    else
        flatpak --system update --assumeyes
        flatpak --system uninstall --unused --assumeyes
    fi
}

_workbench() {
    has wb || fail wb not found.
    ! wb -i || fail Cannot update the workbench container from inside the workbench container.
    header Updating Workbench
    if [ -n "${DOWNLOAD_ONLY:-}" ]
    then
        wb --dry-update
    else
        wb --update
    fi
}

_all() {
    ! has apt-get || _apt
    ! has flatpak || _flatpak
    ! { has wb || wb -i; } || _workbench
}

list_supported() {
    ! has apt-get || echo apt
    ! has flatpak || echo flatpak
    ! has wb || wb -i || echo workbench
    printf '%s' all
}

while getopts 'dhl' opt
do
    case "$opt" in
        d) DOWNLOAD_ONLY=1;;
        h) usage; exit;;
        l) list_supported; exit;;
        *) usage; exit 1;;
    esac
done

shift "$(( OPTIND - 1 ))"

if [ "$#" -eq 0 ]
then
    _all
elif [ "$#" -gt 1 ]
then
    usage
    exit 1
else
    case "$1" in
        all) _all;;
        apt) _apt;;
        flatpak) _flatpak;;
        workbench|wb) _workbench;;
        *) usage; exit 1;;
    esac
fi