#!/bin/bash
# Aria Git-Sync - synct Obsidian Vault zu GitHub
# WICHTIG: Nur aria-brain wird automatisch gesynct!
# Andere Repos (Kadi-v2 etc.) werden MANUELL gepusht (Vercel Credits sparen!)
# Laeuft alle 15 Min via systemd Timer

# 14.07.2026 Post-Mortem-Fix: Pfade auf /home/aria (root→aria User-Migration).
# Log nach ~/logs statt /var/log (fuer User aria nicht schreibbar).
LOG="/home/aria/logs/git-sync.log"
GIT_AUTHOR="Kais Aseckzai"
GIT_EMAIL="aseckzai@gmail.com"

# Credentials via Askpass-Helper bei nicht-interaktiven Runs (systemd, cron).
# .env wird vom Helper on-demand gelesen; hier nur den Pfad exportieren.
export GIT_ASKPASS="/home/aria/scripts/git-askpass.sh"
export GIT_TERMINAL_PROMPT=0

# Hard-fail bei undefinierten Variablen, Pipe-Fehler propagieren
set -uo pipefail

log() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') Git-Sync [$1]: $2" >> "$LOG"
}

sync_repo() {
    local name="$1"
    local path="$2"
    local rc=0

    cd "$path" || { log "$name" "cd $path failed"; return 1; }

    # 03.09.2026 Workaround-Rueckbau: HEARTBEAT.md traegt skip-worktree, solange sie root-owned
    # und unlesbar ist. Sobald sie wieder lesbar ist, Flag automatisch entfernen — sonst bliebe
    # die Datei still unversioniert.
    if [ -r HEARTBEAT.md ] && git ls-files -v HEARTBEAT.md | grep -q '^S'; then
        git update-index --no-skip-worktree HEARTBEAT.md
        log "$name" "skip-worktree auf HEARTBEAT.md entfernt (Datei wieder lesbar)"
    fi

    # Keine Aenderungen? Skip
    if [ -z "$(git status --porcelain)" ]; then
        return 0
    fi

    # 03.09.2026 Fix: git-add-Fehler (z.B. unlesbare root-owned Datei) bricht den Lauf hart ab.
    # Vorher lief der Sync 3 Wochen mit "Push erfolgreich" weiter, obwohl nichts committet wurde.
    local add_err
    add_err=$(git add -A 2>&1)
    rc=$?
    if [ $rc -ne 0 ]; then
        log "$name" "git add fehlgeschlagen (rc=$rc): $add_err"
        return $rc
    fi
    # Commit darf "nothing to commit" sagen (exit 1) - das ist OK
    local commit_err
    commit_err=$(git -c user.name="$GIT_AUTHOR" -c user.email="$GIT_EMAIL" \
        commit -m "$name sync: $(date '+%Y-%m-%d %H:%M:%S')" --quiet 2>&1) || true
    if [ -n "$commit_err" ] && ! echo "$commit_err" | grep -q "nothing to commit"; then
        log "$name" "Commit-Warnung: $commit_err"
    fi

    # Pull mit Rebase bevor Push (verhindert Konflikte wenn Remote geaendert)
    local pull_err
    pull_err=$(git pull --rebase --autostash 2>&1)
    rc=$?
    if [ $rc -ne 0 ]; then
        log "$name" "Pull-Rebase fehlgeschlagen (rc=$rc): $pull_err"
        git rebase --abort 2>&1 | head -3 >> "$LOG" || true
        return 1
    fi

    # Push - Fehler nicht mehr verstecken
    local push_err
    push_err=$(git push 2>&1)
    rc=$?
    if [ $rc -eq 0 ]; then
        log "$name" "Push erfolgreich"
    else
        log "$name" "Push fehlgeschlagen (rc=$rc): $push_err"
        return $rc
    fi
}

# NUR Obsidian Vault automatisch syncen (kein Vercel Deploy!)
sync_repo "vault" "/home/aria/brain"
exit $?

# NICHT MEHR AUTOMATISCH SYNCEN (spart Vercel Credits):
# Andere Repos werden nur manuell gepusht wenn eine Aufgabe fertig ist (max 3-4x/Tag).
