#!/usr/bin/env bash
set -euo pipefail

MANIFEST_URL="https://repo.amigarob.com/porter/releases.json"
CHANNEL="alpha"
WORKDIR="$(mktemp -d /tmp/tvh-butler-porter-bootstrap.XXXXXX)"
cleanup() { rm -rf -- "$WORKDIR"; }
trap cleanup EXIT

for command in curl openssl python3; do
  if ! command -v "$command" >/dev/null 2>&1; then
    echo "HDMI Porter installation requires $command." >&2
    exit 1
  fi
done

echo "[HDMI Porter bootstrap] Downloading the signed HDMI Porter release manifest"
curl --fail --silent --show-error --location --proto '=https' --tlsv1.2 "$MANIFEST_URL" -o "$WORKDIR/releases.json"
curl --fail --silent --show-error --location --proto '=https' --tlsv1.2 "${MANIFEST_URL}.sig" -o "$WORKDIR/releases.json.sig"
cat >"$WORKDIR/release-public-key.pem" <<'PORTER_PUBLIC_KEY'
-----BEGIN PUBLIC KEY-----
MCowBQYDK2VwAyEAimyQUHQrxDDnLVUd5mi4ue6m4LXKPjOakbAsY1cXkEQ=
-----END PUBLIC KEY-----
PORTER_PUBLIC_KEY
openssl pkeyutl -verify -pubin -inkey "$WORKDIR/release-public-key.pem" -sigfile "$WORKDIR/releases.json.sig" -rawin -in "$WORKDIR/releases.json" >/dev/null

python3 - "$WORKDIR/releases.json" "$CHANNEL" "$WORKDIR/release.env" <<'PY'
import json, shlex, sys
manifest = json.load(open(sys.argv[1], encoding='utf-8'))
row = (manifest.get('channels') or {}).get(sys.argv[2]) or {}
for key in ('version', 'url', 'sha256'):
    if not row.get(key):
        raise SystemExit(f'Missing signed release field: {key}')
with open(sys.argv[3], 'w', encoding='utf-8') as handle:
    for key in ('version', 'url', 'sha256'):
        handle.write(f'{key.upper()}={shlex.quote(str(row[key]))}\n')
PY
source "$WORKDIR/release.env"

echo "[HDMI Porter bootstrap] Downloading verified release $VERSION"
curl --fail --silent --show-error --location --proto '=https' --tlsv1.2 "$URL" -o "$WORKDIR/release.tar.gz"
echo "$SHA256  $WORKDIR/release.tar.gz" | sha256sum --check --status
mkdir "$WORKDIR/release"
python3 - "$WORKDIR/release.tar.gz" "$WORKDIR/release" <<'PY'
import pathlib, sys, tarfile
archive, destination = sys.argv[1:]
root = pathlib.Path(destination).resolve()
with tarfile.open(archive, 'r:gz') as bundle:
    for member in bundle.getmembers():
        target = (root / member.name).resolve()
        if root not in target.parents and target != root:
            raise SystemExit(f'Unsafe release path: {member.name}')
    if hasattr(tarfile, 'data_filter'):
        bundle.extractall(root, filter='data')
    else:
        bundle.extractall(root)
PY
SOURCE_DIR="$(find "$WORKDIR/release" -mindepth 1 -maxdepth 1 -type d | head -n 1)"
if [[ -z "$SOURCE_DIR" || ! -f "$SOURCE_DIR/porter/install_node.sh" ]]; then
  echo "The verified Butler release does not contain HDMI Porter." >&2
  exit 1
fi
chmod +x "$SOURCE_DIR/porter/install_node.sh"
echo "[HDMI Porter bootstrap] Starting the interactive node installer"
exec bash "$SOURCE_DIR/porter/install_node.sh" --source-dir "$SOURCE_DIR" "$@"
