#!/bin/bash
set -euo pipefail

source /usr/local/lib/slapt/lib/policy.sh

DRYRUN=0
[[ "${1:-}" == "--dry-run" ]] && DRYRUN=1

pkgbase()
{
    local p="${1%.txz}"
    echo "$p" | sed -E 's/-[^-]+-[^-]+-[^-]+$//'
}

echo "[INFO] Updating repository metadata..."
slapt-get --update

echo "[INFO] Loading installed packages..."

INSTALLED_NAMES="$(
    slapt-get --installed |
    awk '{print $1}' |
    while read -r p; do
        pkgbase "$p"
    done
)"

echo "[INFO] Scanning repository..."

NEW_PKGS=()

while read -r pkg; do

    [[ -z "$pkg" ]] && continue

    if slapt_policy_exclude "$pkg"; then
        echo "[SKIP] $pkg (policy)"
        continue
    fi

    name="$(pkgbase "$pkg")"

    if echo "$INSTALLED_NAMES" | grep -qx "$name"; then
        continue
    fi

    echo "[NEW] $pkg"
    NEW_PKGS+=("$pkg")

done < <(
    slapt-get --search . | awk '{print $1}'
)

if [[ "${#NEW_PKGS[@]}" -eq 0 ]]; then
    echo "[DONE] No new packages found."
    exit 0
fi

if [[ "$DRYRUN" -eq 1 ]]; then
    echo
    echo "[INFO] ${#NEW_PKGS[@]} new package(s) found."
    echo "[DONE] Dry-run complete."
    exit 0
fi

echo
echo "[INFO] ${#NEW_PKGS[@]} new package(s) found."

read -rp "Install all new packages? [y/N] " answer

case "$answer" in
    y|Y|yes|YES)
        ;;
    *)
        echo "[INFO] Installation cancelled."
        exit 0
        ;;
esac

for pkg in "${NEW_PKGS[@]}"; do
    echo "[INSTALL] $pkg"
    slapt-get --install "$pkg"
done

echo "[DONE] install-new finished."
