#!/bin/zsh -f
emulate -LR zsh
setopt ERR_EXIT NO_UNSET PIPE_FAIL EXTENDED_GLOB
sc_distribution=${0:A:h:h}
source "$sc_distribution/macos/common.zsh"
source "$sc_distribution/macos/claude-process.zsh"

zmodload zsh/datetime

sc_recovery_log() {
	printf '%.6f %s\n' "$EPOCHREALTIME" "$*"
}

sc_wait_for_source_exit() {
	local tick
	for tick in {1..100}; do
		kill -0 "$sc_pid" 2>/dev/null || return 0
		/bin/sleep 0.1
	done
	! kill -0 "$sc_pid" 2>/dev/null
}

sc_app='' sc_pid='' sc_root='' sc_user_data='' sc_bootstrap_namespace='' sc_activation=completed sc_installation_attempt_id=''
while (( $# )); do
	(( $# >= 2 )) || exit 0
	case "$1" in
		--app) sc_app=$2 ;;
		--pid) sc_pid=$2 ;;
		--storage-root) sc_root=$2 ;;
		--bootstrap-namespace) sc_bootstrap_namespace=$2 ;;
		--user-data-dir) sc_user_data=$2 ;;
		--activation) sc_activation=$2 ;;
		--installation-attempt-id) sc_installation_attempt_id=$2 ;;
		*) exit 0 ;;
	esac
	shift 2
done
[[ -n "$sc_app" && -n "$sc_pid" && -n "$sc_root" && -n "$sc_user_data" ]] || exit 0
[[ "$sc_bootstrap_namespace" == .s || "$sc_bootstrap_namespace" == .d || "$sc_bootstrap_namespace" == .e ]] || exit 0
[[ "$sc_activation" == pending || "$sc_activation" == completed ]] || exit 0
if ! sc_installation_attempt_valid "$sc_installation_attempt_id"; then
	sc_installation_attempt_initialize
fi
if sc_installation_attempt_valid "$sc_installation_attempt_id"; then
	export SUPERCODE_CLAUDE_INSTALLATION_ATTEMPT_ID=$sc_installation_attempt_id
fi
sc_assert_path "$sc_app"
sc_assert_path "$sc_root"
sc_assert_path "$sc_user_data"
sc_app=${sc_app:A}
sc_root=${sc_root:A}
sc_user_data=${sc_user_data:A}
/bin/mkdir -p "$sc_root/logs"
exec </dev/null >>"$sc_root/logs/recovery.log" 2>&1
sc_telemetry_track 'extension.installation_coordinator_started' "activation=$sc_activation"
sc_verify_process "$sc_app" "$sc_pid" || {
	sc_telemetry_track 'extension.installation_recovery_failed' \
		'failure_stage=process_verification' 'reason_code=unexpected_main_process'
	print -r -- 'relaunch-rejected unexpected-main'
	exit 0
}
sc_identity=$(print -rn -- "$sc_app" | /usr/bin/openssl dgst -sha256 | /usr/bin/awk '{print $NF}')
sc_installation="$sc_root/installations/$sc_identity"
if [[ ! -f "$sc_root/recovery-enabled-v1" ]]; then
	sc_telemetry_track 'extension.installation_recovery_failed' \
		'failure_stage=recovery_preflight' 'reason_code=recovery_disabled'
	exit 0
fi
if [[ "$sc_activation" != pending && ! -f "$sc_installation/installed.json" ]]; then
	sc_telemetry_track 'extension.installation_recovery_failed' \
		'failure_stage=recovery_preflight' 'reason_code=installation_marker_missing'
	exit 0
fi
sc_recovery_log "relaunch-start sourcePid=$sc_pid"
if ! kill -TERM "$sc_pid"; then
	sc_telemetry_track 'extension.installation_recovery_failed' \
		'failure_stage=termination_request' 'reason_code=termination_request_failed'
	exit 0
fi
sc_recovery_log "relaunch-signal-sent sourcePid=$sc_pid"
sc_telemetry_track 'extension.installation_termination_requested'

# Claude can receive the first signal while Electron is still installing its
# lifecycle handlers. Retry the same graceful signal once; never escalate to
# SIGKILL while the application may be persisting native state.
if ! sc_wait_for_source_exit; then
	if ! kill -TERM "$sc_pid"; then
		sc_telemetry_track 'extension.installation_recovery_failed' \
			'failure_stage=termination_retry' 'reason_code=termination_request_failed'
		exit 0
	fi
	sc_recovery_log "relaunch-signal-retried sourcePid=$sc_pid"
fi
if ! sc_wait_for_source_exit; then
	sc_recovery_log 'relaunch-failed reason=source-still-running'
	sc_telemetry_track 'extension.installation_recovery_failed' \
		'failure_stage=application_exit' 'reason_code=source_still_running'
	exit 0
fi
sc_recovery_log "relaunch-source-exited sourcePid=$sc_pid"
sc_telemetry_track 'extension.installation_application_exited'
export SUPERCODE_CLAUDE_STORAGE_ROOT="$sc_root"
export SUPERCODE_CLAUDE_BOOTSTRAP_NAMESPACE="$sc_bootstrap_namespace"
"$sc_app/Contents/MacOS/Claude" "--user-data-dir=$sc_user_data" </dev/null >/dev/null 2>&1 &
sc_relaunched_pid=$!
disown "$sc_relaunched_pid" 2>/dev/null || true
sc_recovery_log "relaunch-launched sourcePid=$sc_pid pid=$sc_relaunched_pid"
sc_telemetry_track 'extension.installation_relaunch_spawned'
