#!/bin/zsh -f

# Installs the recovery trigger into Claude's own local-extension profile. Claude
# runs the bundled JS patcher in its signed Plugin helper; zsh only coordinates relaunch.

sc_configure_recovery_extension() {
	local user_data=${1:A} coordinator_hook=${2:A} extension_source=${3:A} storage_root=${4:A}
	local runtime_version=$5 bootstrap_namespace=$6
	local extension_id=local.supercode-recovery extension_root settings_root target settings_target
	local coordinator_json storage_json runtime_json namespace_json
	local -a existing_names=()
	sc_assert_path "$user_data"
	sc_assert_path "$coordinator_hook"
	sc_assert_path "$extension_source"
	sc_assert_path "$storage_root"
	[[ "$bootstrap_namespace" == .s || "$bootstrap_namespace" == .d || "$bootstrap_namespace" == .e ]] ||
		sc_fail 'Unsupported Claude bootstrap namespace.'
	[[ -n "$runtime_version" ]] || sc_fail 'Claude recovery runtime version is unavailable.'
	[[ -f "$coordinator_hook" && ! -L "$coordinator_hook" ]] || sc_fail 'Claude recovery coordinator is unavailable.'
	[[ -f "$extension_source/manifest.json" && ! -L "$extension_source/manifest.json" ]] ||
		sc_fail 'Claude recovery extension manifest is unavailable.'
	[[ -f "$extension_source/server.cjs" && ! -L "$extension_source/server.cjs" ]] ||
		sc_fail 'Claude recovery extension server is unavailable.'

	/bin/mkdir -p "$user_data"
	[[ -d "$user_data" && ! -L "$user_data" ]] || sc_fail 'Claude user data directory is invalid.'
	extension_root="$user_data/Claude Extensions"
	settings_root="$user_data/Claude Extensions Settings"
	target="$extension_root/$extension_id"
	settings_target="$settings_root/$extension_id.json"
	/bin/mkdir -p "$extension_root" "$settings_root"
	[[ -d "$extension_root" && ! -L "$extension_root" && -d "$settings_root" && ! -L "$settings_root" ]] ||
		sc_fail 'Claude recovery extension directories are invalid.'

	if [[ -e "$target" || -L "$target" ]]; then
		[[ -d "$target" && ! -L "$target" ]] || sc_fail 'Claude recovery extension location is occupied.'
		existing_names=("$target"/*(DN:t))
		[[ ${(j:,:)${(on)existing_names}} == manifest.json,recovery.json,server.cjs,supercode-owned ]] ||
			sc_fail 'Claude recovery extension location is not owned by Supercode.'
		[[ "$(<"$target/supercode-owned")" == 'supercode-claude-recovery-v1' ]] ||
			sc_fail 'Claude recovery extension ownership marker is invalid.'
	else
		/bin/mkdir -m 700 "$target"
	fi

	/bin/cp -p "$extension_source/manifest.json" "$sc_stage/recovery-extension-manifest.json"
	/bin/cp -p "$extension_source/server.cjs" "$sc_stage/recovery-extension-server.cjs"
	print -rn -- 'supercode-claude-recovery-v1' >"$sc_stage/recovery-extension-owned"
	sc_json_string "$coordinator_hook"; coordinator_json=$REPLY
	sc_json_string "$storage_root"; storage_json=$REPLY
	sc_json_string "$runtime_version"; runtime_json=$REPLY
	sc_json_string "$bootstrap_namespace"; namespace_json=$REPLY
	print -r -- "{\"schemaVersion\":1,\"coordinatorHook\":$coordinator_json,\"storageRoot\":$storage_json,\"runtimeVersion\":$runtime_json,\"bootstrapNamespace\":$namespace_json}" \
		>"$sc_stage/recovery-extension-config.json"
	print -r -- '{"isEnabled":true}' >"$sc_stage/recovery-extension-settings.json"

	sc_copy_atomic "$sc_stage/recovery-extension-manifest.json" "$target/manifest.json"
	sc_copy_atomic "$sc_stage/recovery-extension-server.cjs" "$target/server.cjs"
	sc_copy_atomic "$sc_stage/recovery-extension-config.json" "$target/recovery.json"
	sc_copy_atomic "$sc_stage/recovery-extension-owned" "$target/supercode-owned"
	sc_copy_atomic "$sc_stage/recovery-extension-settings.json" "$settings_target"
}
