#!/bin/bash
# Run as the unprivileged deploy account on the relay VM. Retains every prior release.
set -euo pipefail
[[ $# == 2 && $1 =~ ^[0-9a-f]{40}$ ]] || exit 64
revision=$1
wheel=$(realpath "$2")
[[ $wheel == /opt/battlelab-catalog/staging/*.whl ]] || exit 64
root=/opt/battlelab-catalog
release="$root/releases/$revision"
ready() {
    sudo -n /usr/local/sbin/battlelab-catalog-deploy &&
    curl --fail --silent --show-error --max-time 10 -o /dev/null https://relay.battlelab.superstatus.io/catalogs/agents/v1/current.json &&
    curl --fail --silent --show-error --max-time 10 -o /dev/null https://relay.battlelab.superstatus.io/catalogs/source.tar.gz
}
if [[ -e $release || -L $release ]]; then
    [[ ! -L $release && $(readlink -f "$root/current") == "$release" && -d $release/venv ]] || {
        echo 'Existing non-current or partial release retained; refusing overwrite.' >&2
        exit 1
    }
    "$release/venv/bin/python" -c 'import sys; from importlib.resources import files; p=files("battlelab_catalog"); assert (p/"static/revision.txt").read_text().strip() == sys.argv[1]; assert (p/"static/source.tar.gz").is_file(); assert (p/"contract/feed-signers").is_file()' "$revision"
    echo 'Requested revision is already current; verifying readiness without reinstalling.'
    ready
    exit
fi
mkdir -m 755 "$release"   # no overwrite or cleanup of an existing release
python3 -m venv "$release/venv"
"$release/venv/bin/pip" install --disable-pip-version-check "$wheel"
"$release/venv/bin/python" -c 'from importlib.resources import files; p=files("battlelab_catalog"); assert (p/"static/source.tar.gz").is_file(); assert (p/"contract/feed-signers").is_file()'
previous=$(readlink -f "$root/current")
[[ $previous =~ ^/opt/battlelab-catalog/releases/[0-9a-f]{40}$ && -d $previous/venv ]] || {
    echo 'A retained previous release is required; use approved bootstrap for the first install.' >&2
    exit 1
}
printf '%s\n' "$previous" > "$release/previous-release"
ln -s "$release" "$root/.current-$revision"
mv -T "$root/.current-$revision" "$root/current"
if ! ready; then
    echo 'Catalog activation failed; restoring the retained previous release.' >&2
    ln -s "$previous" "$root/.rollback-$revision"
    mv -T "$root/.rollback-$revision" "$root/current"
    if ready; then
        echo 'Previous catalog release restored and verified; failed release retained.' >&2
    else
        echo 'Rollback selected but readiness failed; operator intervention required.' >&2
    fi
    exit 1
fi
