#!/usr/bin/env bash
# Restore ~/.claude/settings.json when a rogue writer guts it, and keep the
# restore source fresh. Driven by claude-settings-heal.path (systemd --user),
# deliberately independent of settings.json: its own hooks are gone exactly
# when healing is needed.
set -euo pipefail

SETTINGS="${CLAUDE_SETTINGS:-$HOME/.claude/settings.json}"
KNOWN_GOOD="${CLAUDE_SETTINGS_KNOWN_GOOD:-$SETTINGS.known-good}"
LOG="${CLAUDE_SETTINGS_HEAL_LOG:-$HOME/.claude/settings-heal.log}"

log() { printf '%s %s\n' "$(date -Is)" "$*" >>"$LOG"; }

healthy() {
    python3 - "$1" <<'PY'
import json
import sys

try:
    with open(sys.argv[1], encoding="utf-8") as handle:
        payload = json.load(handle)
except (OSError, json.JSONDecodeError):
    sys.exit(1)
if not isinstance(payload, dict):
    sys.exit(1)
hooks = payload.get("hooks")
sys.exit(0 if isinstance(hooks, dict) and hooks else 1)
PY
}

replace_atomically() {
    local source="$1" target="$2" temp
    temp="$(mktemp "$target.XXXXXX")"
    cp "$source" "$temp"
    mv -f "$temp" "$target"
}

if healthy "$SETTINGS"; then
    if ! cmp -s "$SETTINGS" "$KNOWN_GOOD"; then
        replace_atomically "$SETTINGS" "$KNOWN_GOOD"
        log "refreshed known-good from healthy settings.json"
    fi
    exit 0
fi

if [[ ! -s "$KNOWN_GOOD" ]]; then
    log "FATAL settings.json unhealthy but no known-good at $KNOWN_GOOD; left as-is"
    exit 1
fi
if ! healthy "$KNOWN_GOOD"; then
    log "FATAL known-good at $KNOWN_GOOD is itself unhealthy; settings.json left as-is"
    exit 1
fi

replace_atomically "$KNOWN_GOOD" "$SETTINGS"
log "RESTORED settings.json from known-good (was gutted)"
