#!/usr/bin/env bash
set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
TEST_ROOT="$(mktemp -d)"
trap 'rm -rf "$TEST_ROOT"' EXIT

FAKE_BIN="$TEST_ROOT/fake-bin"
ASSETS="$TEST_ROOT/assets"
mkdir -p "$FAKE_BIN" "$ASSETS"

printf '%s\n' '#!/usr/bin/env bash' \
    'if [[ "$1" == "-s" ]]; then printf "%s\n" "$BOT_FORGE_TEST_OS"; else printf "%s\n" "$BOT_FORGE_TEST_ARCH"; fi' \
    >"$FAKE_BIN/uname"
printf '%s\n' '#!/usr/bin/env bash' \
    'set -euo pipefail' \
    'destination=""' \
    'url=""' \
    'while [[ "$#" -gt 0 ]]; do' \
    '  if [[ "$1" == "-o" ]]; then destination="$2"; shift 2; else url="$1"; shift; fi' \
    'done' \
    'cp "$BOT_FORGE_TEST_ASSETS/${url##*/}" "$destination"' \
    >"$FAKE_BIN/curl"
chmod +x "$FAKE_BIN/uname" "$FAKE_BIN/curl"
printf '%s\n' '#!/usr/bin/env bash' \
    'if [[ "${BOT_FORGE_TEST_TRANSLATED:-0}" == "1" ]]; then printf "1\n"; else exit 1; fi' \
    >"$FAKE_BIN/sysctl"
chmod +x "$FAKE_BIN/sysctl"

printf 'catalog = "rust-dev"\n' >"$ASSETS/bot-forge.toml"
for asset in \
    linux-x86_64-bot-forge \
    linux-aarch64-bot-forge \
    macos-x86_64-bot-forge \
    macos-aarch64-bot-forge
do
    printf '%s\n' '#!/usr/bin/env bash' \
        'printf "%s|%s|%s\n" "$0" "$*" "${BOT_FORGE_HOME:-}" > "$BOT_FORGE_TEST_RESULT"' \
        >"$ASSETS/$asset"
    chmod +x "$ASSETS/$asset"
done
(
    cd "$ASSETS"
    shasum -a 256 bot-forge.toml linux-*-bot-forge macos-*-bot-forge >SHA256SUMS
)
CHECKSUMS_SHA256="$(shasum -a 256 "$ASSETS/SHA256SUMS" | awk '{print $1}')"

TAMPER_ROOT="$TEST_ROOT/tampered manifest"
if PATH="$FAKE_BIN:$PATH" \
    HOME="$TAMPER_ROOT/user home" \
    BOT_FORGE_HOME="$TAMPER_ROOT/data" \
    BOT_FORGE_BIN_DIR="$TAMPER_ROOT/bin" \
    BOT_FORGE_CONFIG_DIR="$TAMPER_ROOT/config" \
    BOT_FORGE_BASE_URL="https://example.invalid" \
    BOT_FORGE_CHECKSUMS_SHA256="0000000000000000000000000000000000000000000000000000000000000000" \
    BOT_FORGE_TEST_OS="Linux" \
    BOT_FORGE_TEST_ARCH="x86_64" \
    BOT_FORGE_TEST_ASSETS="$ASSETS" \
    bash "$ROOT_DIR/install.sh" standard --yes >/dev/null 2>&1; then
    printf 'installer accepted an untrusted SHA256SUMS manifest.\n' >&2
    exit 1
fi

run_case() {
    local os="$1"
    local arch="$2"
    local platform="$3"
    local case_root="$TEST_ROOT/$platform with spaces"
    local result="$case_root/result"
    mkdir -p "$case_root"
    PATH="$FAKE_BIN:$PATH" \
        HOME="$case_root/user home" \
        BOT_FORGE_HOME="$case_root/data" \
        BOT_FORGE_BIN_DIR="$case_root/bin" \
        BOT_FORGE_CONFIG_DIR="$case_root/config" \
        BOT_FORGE_BASE_URL="https://example.invalid" \
        BOT_FORGE_CHECKSUMS_SHA256="$CHECKSUMS_SHA256" \
        BOT_FORGE_TEST_OS="$os" \
        BOT_FORGE_TEST_ARCH="$arch" \
        BOT_FORGE_TEST_ASSETS="$ASSETS" \
        BOT_FORGE_TEST_RESULT="$result" \
        bash "$ROOT_DIR/install.sh" standard --yes
    grep -Fq "$case_root/bin/bot-forge|install --config $case_root/config/bot-forge.toml standard --yes|$case_root/data" "$result"
    cmp "$ASSETS/$platform-bot-forge" "$case_root/bin/bot-forge"
    cmp "$ASSETS/bot-forge.toml" "$case_root/config/bot-forge.toml"

    printf 'catalog = "preserved"\n' >"$case_root/config/bot-forge.toml"
    PATH="$FAKE_BIN:$PATH" \
        HOME="$case_root/user home" \
        BOT_FORGE_HOME="$case_root/data" \
        BOT_FORGE_BIN_DIR="$case_root/bin" \
        BOT_FORGE_CONFIG_DIR="$case_root/config" \
        BOT_FORGE_BASE_URL="https://example.invalid" \
        BOT_FORGE_CHECKSUMS_SHA256="$CHECKSUMS_SHA256" \
        BOT_FORGE_TEST_OS="$os" \
        BOT_FORGE_TEST_ARCH="$arch" \
        BOT_FORGE_TEST_ASSETS="$ASSETS" \
        BOT_FORGE_TEST_RESULT="$result" \
        bash "$ROOT_DIR/install.sh" smoke --yes
    grep -Fxq 'catalog = "preserved"' "$case_root/config/bot-forge.toml"
}

run_case Linux x86_64 linux-x86_64
run_case Linux aarch64 linux-aarch64
run_case Darwin x86_64 macos-x86_64
run_case Darwin arm64 macos-aarch64

ROSETTA_ROOT="$TEST_ROOT/macos rosetta"
PATH="$FAKE_BIN:$PATH" \
    HOME="$ROSETTA_ROOT/user home" \
    BOT_FORGE_HOME="$ROSETTA_ROOT/data" \
    BOT_FORGE_BIN_DIR="$ROSETTA_ROOT/bin" \
    BOT_FORGE_CONFIG_DIR="$ROSETTA_ROOT/config" \
    BOT_FORGE_BASE_URL="https://example.invalid" \
    BOT_FORGE_CHECKSUMS_SHA256="$CHECKSUMS_SHA256" \
    BOT_FORGE_TEST_OS="Darwin" \
    BOT_FORGE_TEST_ARCH="x86_64" \
    BOT_FORGE_TEST_TRANSLATED="1" \
    BOT_FORGE_TEST_ASSETS="$ASSETS" \
    BOT_FORGE_TEST_RESULT="$ROSETTA_ROOT/result" \
    bash "$ROOT_DIR/install.sh" smoke --yes
cmp "$ASSETS/macos-aarch64-bot-forge" "$ROSETTA_ROOT/bin/bot-forge"

DEFAULT_ROOT="$TEST_ROOT/macos defaults"
PATH="$FAKE_BIN:$PATH" \
    HOME="$DEFAULT_ROOT/user home" \
    BOT_FORGE_BASE_URL="https://example.invalid" \
    BOT_FORGE_CHECKSUMS_SHA256="$CHECKSUMS_SHA256" \
    BOT_FORGE_TEST_OS="Darwin" \
    BOT_FORGE_TEST_ARCH="arm64" \
    BOT_FORGE_TEST_ASSETS="$ASSETS" \
    BOT_FORGE_TEST_RESULT="$DEFAULT_ROOT/result" \
    bash "$ROOT_DIR/install.sh" smoke --yes
grep -Fq "$DEFAULT_ROOT/user home/Library/Application Support/bot-forge/bin/bot-forge|install --config $DEFAULT_ROOT/user home/Library/Application Support/bot-forge/config/bot-forge.toml smoke --yes|" "$DEFAULT_ROOT/result"

printf 'Linux and macOS installer platform contracts passed.\n'
