#!/bin/zsh -f

# External marker/profile adapter. Hashes classify one known installation; they
# never select a patcher or admit a new Claude version.

sc_plist_value() {
	/usr/bin/plutil -extract "$2" raw "$1" 2>/dev/null
}

sc_installation_state() {
	local app=${1:A} directory=$2 pid=$3 admission manifest
	local marker_app marker_pid manifest_app bundle asar_native asar_patched plist_native plist_patched
	admission="$directory/admission-in-progress.json"
	manifest="$directory/installed.json"
	if [[ -f "$admission" && ! -L "$admission" ]]; then
		marker_app=$(sc_plist_value "$admission" appPath || true)
		marker_pid=$(sc_plist_value "$admission" pid || true)
		if [[ "$(sc_plist_value "$admission" schemaVersion || true)" == 1 && "$marker_app" == "$app" && "$marker_pid" == "$pid" ]] &&
			kill -0 "$marker_pid" 2>/dev/null; then
			REPLY=admission-active
			return
		fi
	fi
	if [[ ! -e "$manifest" ]]; then
		REPLY=uninstalled
		return
	fi
	[[ -f "$manifest" && ! -L "$manifest" ]] || sc_fail 'Invalid Claude installation marker.'
	manifest_app=$(sc_plist_value "$manifest" appPath || true)
	bundle=$(sc_plist_value "$manifest" bundleIdentifier || true)
	[[ "$(sc_plist_value "$manifest" schemaVersion || true)" == 1 && "$manifest_app" == "$app" && "$bundle" == com.anthropic.claudefordesktop ]] ||
		sc_fail 'Invalid Claude installation marker.'
	asar_native=$(sc_plist_value "$manifest" resources.asar.pristineSha256 || true)
	asar_patched=$(sc_plist_value "$manifest" resources.asar.patchedSha256 || true)
	plist_native=$(sc_plist_value "$manifest" resources.infoPlist.pristineSha256 || true)
	plist_patched=$(sc_plist_value "$manifest" resources.infoPlist.patchedSha256 || true)
	local asar_current=$(sc_sha256_file "$app/Contents/Resources/app.asar")
	local plist_current=$(sc_sha256_file "$app/Contents/Info.plist")
	if [[ "$asar_current" == "$asar_patched" && "$plist_current" == "$plist_patched" ]]; then
		REPLY=already-patched
	elif [[ "$asar_current" == "$asar_native" && "$plist_current" == "$plist_native" ]]; then
		REPLY=pristine
	elif [[ ( "$asar_current" == "$asar_native" || "$asar_current" == "$asar_patched" ) &&
		( "$plist_current" == "$plist_native" || "$plist_current" == "$plist_patched" ) ]]; then
		REPLY=managed-mixed
	else
		REPLY=unknown
	fi
}
