#!/usr/bin/env bash
# tv-debloat.sh – Pakete auf dem EIGENEN Android TV deaktivieren (umkehrbar)
#
#   ./tv-debloat.sh -f pakete.txt             # Trockenlauf (Standard): zeigt nur, was passieren würde
#   ./tv-debloat.sh --apply -f pakete.txt     # wirklich ausführen
#   ./tv-debloat.sh --apply paket.eins paket.zwei
#   ./tv-debloat.sh --apply --uninstall -f pakete.txt   # statt deaktivieren: für Benutzer 0 entfernen
#
# Was das Skript tut:
#   - prüft JEDES Paket vorher mit „pm list packages“ (fehlt es, wird es übersprungen)
#   - deaktiviert mit „pm disable-user --user 0“ (Standard) oder entfernt mit „pm uninstall -k --user 0“
#   - verweigert Pakete, ohne die der Fernseher nicht mehr bedienbar ist (Liste PROTECTED)
#   - schreibt ein Protokoll (tv-debloat-JJJJMMTT-HHMMSS.log) für tv-debloat-undo.sh
#
# Rückweg: ./tv-debloat-undo.sh --apply -f tv-debloat-….log
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
# shellcheck source=tv-lib.sh
. "$SCRIPT_DIR/tv-lib.sh"

# Pakete, die dieses Skript nie anfasst.
PROTECTED="
android
com.android.systemui
com.android.settings
com.android.tv.settings
com.android.providers.settings
com.android.shell
com.android.location.fused
com.android.vending
com.google.android.gms
com.google.android.gsf
com.google.android.tv.remote.service
"

usage() { sed -n '2,15p' "$0" | sed 's/^# \{0,1\}//'; exit "${1:-0}"; }

APPLY=0
MODE="disable"
PACKAGES=""

while [ $# -gt 0 ]; do
  case "$1" in
    --apply) APPLY=1 ;;
    --dry-run) APPLY=0 ;;
    --uninstall) MODE="uninstall" ;;
    -f|--file)
      [ $# -ge 2 ] || usage 1
      PACKAGES="$PACKAGES
$(tv_read_list "$2")"
      shift ;;
    -h|--help) usage 0 ;;
    -*) tv_die "Unbekannte Option: $1" ;;
    *) PACKAGES="$PACKAGES
$1" ;;
  esac
  shift
done

PACKAGES="$(printf '%s\n' "$PACKAGES" | grep -v '^$' | sort -u || true)"
[ -n "$PACKAGES" ] || usage 1

tv_connect
tv_load_packages

LOG=""
if [ "$APPLY" -eq 1 ]; then
  LOG="tv-debloat-$(date +%Y%m%d-%H%M%S).log"
  printf '# tv-debloat.sh · %s · Modus %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$MODE" > "$LOG"
else
  tv_info "Trockenlauf – es wird nichts verändert. Mit --apply ausführen."
fi

changed=0
skipped=0
while IFS= read -r pkg; do
  if ! tv_valid_package "$pkg"; then
    tv_info "übersprungen  $pkg (kein gültiger Paketname)"
    skipped=$((skipped + 1)); continue
  fi
  if grep -qxF -- "$pkg" <<<"$PROTECTED"; then
    tv_info "geschützt     $pkg (wird nie verändert)"
    skipped=$((skipped + 1)); continue
  fi
  state="$(tv_pkg_state "$pkg")"
  case "$state" in
    fehlt)
      tv_info "nicht da      $pkg"
      skipped=$((skipped + 1)); continue ;;
    entfernt)
      tv_info "schon entfernt $pkg"
      skipped=$((skipped + 1)); continue ;;
    deaktiviert)
      if [ "$MODE" = "disable" ]; then
        tv_info "schon aus     $pkg"
        skipped=$((skipped + 1)); continue
      fi ;;
  esac
  if [ "$MODE" = "uninstall" ]; then
    action="pm uninstall -k --user $TV_USER $pkg"
  else
    action="pm disable-user --user $TV_USER $pkg"
  fi
  if [ "$APPLY" -eq 1 ]; then
    # $action ist bewusst unquotiert: adb setzt die Wörter auf dem Gerät wieder zusammen.
    # shellcheck disable=SC2086
    if tv_shell $action >/dev/null; then
      tv_info "erledigt      $action"
      printf '%s\n' "$pkg" >> "$LOG"
      changed=$((changed + 1))
    else
      tv_info "FEHLER        $action"
      skipped=$((skipped + 1))
    fi
  else
    tv_info "würde         adb -s $TV_HOST shell $action"
    changed=$((changed + 1))
  fi
done <<<"$PACKAGES"

if [ "$APPLY" -eq 1 ]; then
  tv_info "$changed geändert, $skipped übersprungen. Protokoll: $LOG"
  tv_info "Rückgängig: ./tv-debloat-undo.sh --apply -f $LOG"
else
  tv_info "$changed Paket(e) würden geändert, $skipped übersprungen."
fi
