#!/usr/bin/env bash

set -euo pipefail

repo_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
installer="$repo_dir/setup/scripts/link-vicinae-scripts"
dotfile_installer="$repo_dir/setup/scripts/link-dotfiles"
top_level_installer="$repo_dir/install"
work="$(mktemp -d /tmp/panama-command-install.XXXXXX)"
data_dir="$work/share/vicinae"
fake_bin="$work/bin"
vicinae_log="$work/vicinae.log"

fail() {
    printf 'Panama command install contract: %s\n' "$1" >&2
    exit 1
}

cleanup() {
    rm -rf "$work"
}
trap cleanup EXIT

[[ -x "$installer" ]] || fail 'Vicinae script installer is missing or not executable'
if rg -q 'setup/scripts/link-vicinae-scripts' "$dotfile_installer"; then
    fail 'link-dotfiles also invokes the command installer'
fi
# Each setup stage must run in its OWN process, so strict-shell options and
# helper variables stay local to the script that owns them. What matters is
# that the stages are executed rather than sourced -- this previously matched
# the literal one-liner `do "$script"; done`, which failed the moment the loop
# gained error reporting and spanned more than one line, despite the property
# it cares about being unchanged.
rg -q '(^|[^a-z-])(\.|source)\s+[^;]*setup/scripts' "$top_level_installer" \
    && fail 'top-level installer sources setup scripts into one shared shell'
rg -q '"\$script"' "$top_level_installer" \
    || fail 'top-level installer does not execute the setup scripts'

mkdir -p "$data_dir/scripts/panama" "$fake_bin"
printf 'user-owned\n' >"$data_dir/scripts/panama/keep.sh"

cat >"$fake_bin/vicinae" <<'EOF'
#!/usr/bin/env bash
printf 'vicinae' >>"$PANAMA_VICINAE_TEST_LOG"
printf ' <%s>' "$@" >>"$PANAMA_VICINAE_TEST_LOG"
printf '\n' >>"$PANAMA_VICINAE_TEST_LOG"
[[ ${1:-} == ping || ${1:-} == cmd ]]
EOF
chmod +x "$fake_bin/vicinae"

PATH="$fake_bin:$PATH" PANAMA_PATH="$repo_dir" VICINAE_DATA_DIR="$data_dir" \
    PANAMA_VICINAE_TEST_LOG="$vicinae_log" "$installer" >/dev/null

target="$data_dir/scripts/panama"
backup="$data_dir/backups/panama.pre-panama"
[[ -L "$target" ]] || fail 'Panama command directory was not linked'
[[ "$(readlink -f "$target")" == "$(readlink -f "$repo_dir/config/local/share/vicinae/scripts")" ]] \
    || fail 'runtime command link points outside the tracked source'
[[ -f "$backup/keep.sh" ]] || fail 'pre-existing user command directory was not preserved'
[[ "$(cat "$backup/keep.sh")" == user-owned ]] || fail 'preserved user command changed'
[[ ! -e "$data_dir/scripts/panama.pre-panama" ]] \
    || fail 'preserved commands remained inside Vicinae search paths'

expected_calls=$'vicinae <ping>\nvicinae <cmd> <launch> <core:reload-scripts>'
[[ "$(cat "$vicinae_log")" == "$expected_calls" ]] \
    || fail "Vicinae reload sequence was wrong: $(cat "$vicinae_log")"

# A second setup pass must update the same narrow link without creating more
# backups or disturbing the preserved directory.
: >"$vicinae_log"
PATH="$fake_bin:$PATH" PANAMA_PATH="$repo_dir" VICINAE_DATA_DIR="$data_dir" \
    PANAMA_VICINAE_TEST_LOG="$vicinae_log" "$installer" >/dev/null
[[ -L "$target" ]] || fail 'second install did not leave the command link intact'
[[ -f "$backup/keep.sh" ]] || fail 'second install disturbed the original backup'
[[ ! -e "$data_dir/backups/panama.pre-panama.pre-panama" ]] \
    || fail 'second install created a duplicate backup'

printf 'Panama command install contract: PASS\n'
