#!/bin/sh
# LocalFlow installer — https://localflow.eu.com
# Usage:  curl -fsSL https://localflow.eu.com/install.sh | sh
#
# Downloads the latest LocalFlow, installs it into /Applications and opens
# it. Terminal downloads carry no quarantine flag, so unlike a browser
# download this never triggers Gatekeeper dialogs. Also works as an
# in-place upgrade: a running copy is quit and replaced.
set -eu

ZIP_URL="${LOCALFLOW_ZIP_URL:-https://localflow.eu.com/LocalFlow.zip}"
APP="LocalFlow.app"
EXPECTED_BUNDLE_ID="agency.perpetuum.localflow"
EXPECTED_TEAM_ID="723ZQS7J5L"

if [ "$(uname -m)" != "arm64" ]; then
	echo "LocalFlow needs a Mac with Apple Silicon (M1 or newer, 2020+)." >&2
	exit 1
fi

DEST="${LOCALFLOW_INSTALL_DIR:-/Applications}"
if [ ! -w "$DEST" ]; then
	DEST="$HOME/Applications"
	mkdir -p "$DEST"
fi

TMP="$(mktemp -d)"
trap 'rm -rf "$TMP"' EXIT

echo "Downloading LocalFlow…"
curl -fsSL "$ZIP_URL" -o "$TMP/LocalFlow.zip"
ditto -x -k "$TMP/LocalFlow.zip" "$TMP"

if [ ! -d "$TMP/$APP" ] || [ -L "$TMP/$APP" ]; then
	echo "The LocalFlow download does not contain a valid app bundle." >&2
	exit 1
fi

DOWNLOADED_BUNDLE_ID="$(/usr/libexec/PlistBuddy -c 'Print :CFBundleIdentifier' "$TMP/$APP/Contents/Info.plist" 2>/dev/null || true)"
if [ "$DOWNLOADED_BUNDLE_ID" != "$EXPECTED_BUNDLE_ID" ]; then
	echo "The LocalFlow download has an unexpected bundle identity." >&2
	exit 1
fi

if ! codesign --verify --deep --strict "$TMP/$APP"; then
	echo "LocalFlow’s Apple signature or notarization could not be verified; the existing app was not changed." >&2
	exit 1
fi
SIGNING_INFO="$(codesign -dv --verbose=4 "$TMP/$APP" 2>&1)"
if ! printf '%s\n' "$SIGNING_INFO" | grep -Fq "Authority=Developer ID Application:" || \
	! printf '%s\n' "$SIGNING_INFO" | grep -Fq "TeamIdentifier=$EXPECTED_TEAM_ID" || \
	! printf '%s\n' "$SIGNING_INFO" | grep -Eq '^CodeDirectory .*flags=.*\(runtime\)' || \
	! spctl --assess --type execute "$TMP/$APP"; then
	echo "LocalFlow’s Apple signature or notarization could not be verified; the existing app was not changed." >&2
	exit 1
fi
echo "Verified LocalFlow’s Apple signature and notarization."

# Quit a running copy so the bundle can be replaced, then swap it out
# entirely — an overlay would keep stale files (and a quarantine flag
# from an earlier browser install).
osascript -e 'quit app "LocalFlow"' 2>/dev/null || true
rm -rf "$DEST/$APP"
mv "$TMP/$APP" "$DEST/$APP"

echo "Installed $DEST/$APP — opening it now. Enjoy!"
if [ "${LOCALFLOW_SKIP_OPEN:-0}" = "1" ]; then
	echo "Opening skipped by request."
else
	open "$DEST/$APP"
fi
