#!/usr/bin/env bash
# clean.sh — systematisches Reclaiming von Dev-Caches (macOS).
#
# Problem: lokale Builds + globale Toolchain-Caches (Gradle, Xcode DerivedData,
# iOS-Simulatoren) wuchern bis die Platte voll ist und Builds/Emulator failen
# ("not enough disk space"). deploy.sh räumt nur die PROJEKT-Build-Dirs;
# globale Caches verwaltet sonst niemand. Dieses Script schließt die Lücke.
#
# Tiers:
#   (default)   project: android/build, android/app/build, android/.gradle, ios/build
#               + Xcode DerivedData (komplett) + nicht-verfügbare iOS-Sims.
#               Alles regeneriert sich beim nächsten Build (kein Daten-Verlust).
#   --deep      zusätzlich: globaler Gradle-Cache (~/.gradle/caches) + ios/Pods.
#               Frei mehr Platz, aber der NÄCHSTE Build lädt Deps/Pods neu (langsamer).
#   --check     nur Diagnose (df + Top-Verbraucher), löscht nichts.
#
# Nutzung:
#   ./clean.sh            # sicheres Reclaiming
#   ./clean.sh --deep     # aggressiv (global gradle + pods)
#   ./clean.sh --check    # nur anschauen
set -uo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ANDROID_DIR="$SCRIPT_DIR/android"
IOS_DIR="$SCRIPT_DIR/ios"

MODE="safe"
GUARD_GB="${2:-8}"
case "${1:-}" in
  --deep)  MODE="deep" ;;
  --check) MODE="check" ;;
  --guard) MODE="guard" ;;
  "" )     MODE="safe" ;;
  *) echo "Unbekannte Option: $1 (erlaubt: --deep, --check, --guard [GB])"; exit 1 ;;
esac

free_gb() { df -g / 2>/dev/null | awk 'NR==2 {print $4}'; }

human() { du -sh "$1" 2>/dev/null | awk '{print $1}'; }

# --guard [GB]: stiller Pre-Build-Check. Warnt nur, wenn frei < Schwelle (8G).
# Wird von dev.sh/deploy.sh vor dem Build aufgerufen — bricht NIE ab (exit 0).
if [ "$MODE" = "guard" ]; then
  FREE="$(free_gb)"
  if [ "${FREE:-99}" -lt "$GUARD_GB" ]; then
    echo "⚠️  Nur ${FREE}G frei (< ${GUARD_GB}G) — Build/Emulator könnte an Speicher scheitern."
    echo "    Aufräumen: ./clean.sh   (mehr: ./clean.sh --deep)"
  fi
  exit 0
fi

echo "── Disk-Status ────────────────────────────────────────────"
df -h / | sed -n '1p;2p'
BEFORE_GB="$(free_gb)"
echo

report_targets() {
  echo "Top-Verbraucher (Dev-Caches):"
  for d in "$ANDROID_DIR/app/build" "$ANDROID_DIR/build" "$ANDROID_DIR/.gradle" \
           "$IOS_DIR/build" "$IOS_DIR/Pods" "$HOME/.gradle/caches" \
           "$HOME/Library/Developer/Xcode/DerivedData" \
           "$HOME/Library/Developer/CoreSimulator"; do
    [ -e "$d" ] && printf "  %-60s %s\n" "$d" "$(human "$d")"
  done
}

if [ "$MODE" = "check" ]; then
  report_targets
  echo; echo "free: ${BEFORE_GB}G — (nur Diagnose, nichts gelöscht)"
  exit 0
fi

report_targets
echo

# Gradle-Daemon stoppen, sonst sind android/build & .gradle gelockt.
echo "→ Gradle-Daemon stoppen…"
( cd "$ANDROID_DIR" 2>/dev/null && ./gradlew --stop >/dev/null 2>&1 ) || true
pkill -f "GradleDaemon" 2>/dev/null || true

rmrf() { [ -e "$1" ] && { echo "  rm $1 ($(human "$1"))"; rm -rf "$1"; } || true; }

echo "→ Projekt-Build-Artefakte…"
rmrf "$ANDROID_DIR/app/build"
rmrf "$ANDROID_DIR/build"
rmrf "$ANDROID_DIR/.gradle"
rmrf "$IOS_DIR/build"

echo "→ Xcode DerivedData…"
rmrf "$HOME/Library/Developer/Xcode/DerivedData"

echo "→ nicht-verfügbare iOS-Simulatoren…"
xcrun simctl delete unavailable >/dev/null 2>&1 || true

if [ "$MODE" = "deep" ]; then
  echo "→ [deep] globaler Gradle-Cache (~/.gradle/caches)…"
  rmrf "$HOME/.gradle/caches"
  echo "→ [deep] ios/Pods (pod install nötig danach)…"
  rmrf "$IOS_DIR/Pods"
fi

echo
echo "── Ergebnis ───────────────────────────────────────────────"
df -h / | sed -n '2p'
AFTER_GB="$(free_gb)"
echo "frei vorher: ${BEFORE_GB}G  →  nachher: ${AFTER_GB}G  (≈ $((AFTER_GB - BEFORE_GB))G zurückgewonnen)"
echo
echo "Hinweis: nächster Android-Build ist langsamer (Caches regenerieren)."
if [ "$MODE" = "deep" ]; then
  echo "         iOS braucht 'pod install' (ios/Pods gelöscht)."
fi
exit 0
