#!/bin/bash

restoreDir="/etc/restore"

function is_bin_in_path {
    builtin type -P "$1" &>/dev/null
}

hook_check() {
    if ! is_bin_in_path aptitude; then
      echo "aptitude needs to be installed for backups to work properly."
      exit 1
    fi

    if ! is_bin_in_path rsync; then
      echo "rsync needs to be installed for backups to work properly."
      exit 1
    fi
}

hook_pre() {
    mkdir -p "$restoreDir" || exit 1
    pushd "$restoreDir" || exit 2

    dpkg --get-selections > Package.list
    aptitude search --disable-columns -F%p '~i!~M!~v' > InstallOnly.list
    #apt-key exportall > /etc/restore/Repo.keys
    cp -a /etc/apt/sources.list "$restoreDir/"
    rsync -avhHi /etc/apt/sources.list.d "$restoreDir/"
    rsync -avhHi /etc/apt/trusted.gpg.d "$restoreDir/"
    [[ -d /etc/apt/keyrings ]] && rsync -avhHi /etc/apt/keyrings "$restoreDir/"

    cat > restore.sh <<EOF
#!/bin/bash

if [[ ! -f "InstallOnly.list" ]]; then
    echo "This needs to be run inside the restore directory."
    exit 1
fi
if [[ ! -d "trusted.gpg.d" ]]; then
    echo "This needs to be run inside the restore directory."
    exit 1
fi

#apt-key add /etc/restore/Repo.keys
#dpkg --set-selections < /etc/restore/Package.list
#apt-get dselect-upgrade

install=""

echo " * Installing required packages"
dpkg-query -s 'rsync' &>/dev/null               || install+=" rsync"
dpkg-query -s 'aptitude' &>/dev/null            || install+=" aptitude"
dpkg-query -s 'borgbackup' &>/dev/null          || install+=" borgbackup"
dpkg-query -s 'borgmatic' &>/dev/null           || install+=" borgmatic"
dpkg-query -s 'apt-transport-https' &>/dev/null || install+=" apt-transport-https"

if [[ -n "\$install" ]]; then
    apt -y install \$install
fi

echo " * Enabling 32-bit packages"
grep ':i386' InstallOnly.list &>/dev/null && dpkg --add-architecture i386

echo " * Restoring repositories and keys"
cp -a sources.list /etc/apt/sources.list
rsync --ignore-existing -raz sources.list.d/ /etc/apt/sources.list.d/
rsync --ignore-existing -raz trusted.gpg.d/ /etc/apt/trusted.gpg.d/
[[ -d keyrings ]] && rsync --ignore-existing -raz keyrings/ /etc/apt/keyrings/

apt update

failinstall=""
flatpak=0

echo " * Gathering installed packages"
#xargs aptitude --schedule-only install < InstallOnly.list
while read p; do
    if [[ "\$p" = "flatpak" ]]; then
      flatpak=1
    fi

    dpkg-query -s "\$p" &>/dev/null 
    if [[ "\$?" -eq 1 ]]; then
        aptitude --schedule-only install "\$p"
        if [[ "\$?" -ne 0 ]]; then
            if [[ -z "\$failinstall" ]]; then
                failinstall+="\$p"
            else
                failinstall+=", \$p"
            fi
        fi
    fi
done < InstallOnly.list

echo "Packages that failed to schedule for install:"
echo "\$failinstall"

echo " * Restoring installed packages (please confirm)"
aptitude install

if [[ "\$flatpak" -eq 1 ]]; then
    echo " * Adding flatpak repo: Flathub"
    flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
fi

echo "Packages that failed to schedule for install:"
echo "\$failinstall"
EOF
    chmod ug+rx restore.sh
    popd || exit 2
}

hook_post() {
    :
}


case "$1" in
    before_check)   hook_check || exit $?;;
    before_backup)  hook_pre   || exit $?;;
    after_backup)   hook_post  || exit $?;;
esac